@jrmc/adonis-attachment 6.0.0-alpha.1 → 6.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/commands/make/attachment_v5_migration.d.ts.map +1 -1
- package/build/commands/make/attachment_v5_migration.js +6 -3
- package/build/commands/make/attachment_v5_migration.js.map +1 -1
- package/build/commands/make/attachments_table.d.ts.map +1 -1
- package/build/commands/make/attachments_table.js +8 -2
- package/build/commands/make/attachments_table.js.map +1 -1
- package/build/index.d.ts +6 -6
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -5
- package/build/index.js.map +1 -1
- package/build/providers/attachment_provider.d.ts.map +1 -1
- package/build/providers/attachment_provider.js +16 -0
- package/build/providers/attachment_provider.js.map +1 -1
- package/build/src/define_config.d.ts +13 -0
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +8 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/integrations/lucid/{attachment_column.d.ts → column/attachment_column.d.ts} +2 -2
- package/build/src/integrations/lucid/column/attachment_column.d.ts.map +1 -0
- package/build/src/integrations/lucid/{attachment_column.js → column/attachment_column.js} +2 -2
- package/build/src/integrations/lucid/column/attachment_column.js.map +1 -0
- package/build/src/integrations/lucid/index.d.ts +16 -13
- package/build/src/integrations/lucid/index.d.ts.map +1 -1
- package/build/src/integrations/lucid/index.js +16 -13
- package/build/src/integrations/lucid/index.js.map +1 -1
- package/build/src/integrations/lucid/migrations/legacy/legacy_attachment_migration_stub.d.ts +20 -0
- package/build/src/integrations/lucid/migrations/legacy/legacy_attachment_migration_stub.d.ts.map +1 -0
- package/build/src/integrations/lucid/migrations/legacy/legacy_attachment_migration_stub.js +18 -0
- package/build/src/integrations/lucid/migrations/legacy/legacy_attachment_migration_stub.js.map +1 -0
- package/build/src/integrations/lucid/{migrate_legacy_attachment.d.ts → migrations/legacy/migrate_legacy_attachment.d.ts} +19 -10
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.d.ts.map +1 -0
- package/build/src/integrations/lucid/{migrate_legacy_attachment.js → migrations/legacy/migrate_legacy_attachment.js} +28 -23
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.js.map +1 -0
- package/build/src/integrations/lucid/{migrate_legacy_attachment_records.d.ts → migrations/legacy/migrate_legacy_attachment_records.d.ts} +3 -3
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.d.ts.map +1 -0
- package/build/src/integrations/lucid/{migrate_legacy_attachment_records.js → migrations/legacy/migrate_legacy_attachment_records.js} +7 -6
- package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.js.map +1 -0
- package/build/src/integrations/lucid/models/attachment_link_model.d.ts +30 -0
- package/build/src/integrations/lucid/models/attachment_link_model.d.ts.map +1 -0
- package/build/src/integrations/lucid/models/attachment_link_model.js +58 -0
- package/build/src/integrations/lucid/models/attachment_link_model.js.map +1 -0
- package/build/src/integrations/lucid/{attachment_model.d.ts → models/attachment_model.d.ts} +2 -7
- package/build/src/integrations/lucid/models/attachment_model.d.ts.map +1 -0
- package/build/src/integrations/lucid/{attachment_model.js → models/attachment_model.js} +1 -16
- package/build/src/integrations/lucid/models/attachment_model.js.map +1 -0
- package/build/src/integrations/lucid/{lucid_attachment_lifecycle_service.d.ts → persistence/lucid_attachment_lifecycle_service.d.ts} +17 -13
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.d.ts.map +1 -0
- package/build/src/integrations/lucid/{lucid_attachment_lifecycle_service.js → persistence/lucid_attachment_lifecycle_service.js} +27 -20
- package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js.map +1 -0
- package/build/src/integrations/lucid/{lucid_attachment_repository.d.ts → persistence/lucid_attachment_repository.d.ts} +3 -3
- package/build/src/integrations/lucid/persistence/lucid_attachment_repository.d.ts.map +1 -0
- package/build/src/integrations/lucid/{lucid_attachment_repository.js → persistence/lucid_attachment_repository.js} +1 -1
- package/build/src/integrations/lucid/persistence/lucid_attachment_repository.js.map +1 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.d.ts +48 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.d.ts.map +1 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.js +224 -0
- package/build/src/integrations/lucid/persistence/lucid_attachment_store.js.map +1 -0
- package/build/src/integrations/lucid/{lucid_variant_generation_service.d.ts → persistence/lucid_variant_generation_service.d.ts} +3 -3
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.d.ts.map +1 -0
- package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.js.map +1 -0
- package/build/src/integrations/lucid/relations/attachment_owner.d.ts.map +1 -0
- package/build/src/integrations/lucid/relations/attachment_owner.js.map +1 -0
- package/build/src/integrations/lucid/{attachment_relation.d.ts → relations/attachment_relation.d.ts} +25 -14
- package/build/src/integrations/lucid/relations/attachment_relation.d.ts.map +1 -0
- package/build/src/integrations/lucid/relations/attachment_relation.js +266 -0
- package/build/src/integrations/lucid/relations/attachment_relation.js.map +1 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts +24 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts.map +1 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.js +68 -0
- package/build/src/integrations/lucid/schema/attachment_schema_service.js.map +1 -0
- package/build/src/integrations/lucid/schema/attachment_table_names.d.ts +15 -0
- package/build/src/integrations/lucid/schema/attachment_table_names.d.ts.map +1 -0
- package/build/src/integrations/lucid/schema/attachment_table_names.js +20 -0
- package/build/src/integrations/lucid/schema/attachment_table_names.js.map +1 -0
- package/build/src/integrations/lucid/schema/attachments_table_stub.d.ts.map +1 -0
- package/build/src/integrations/lucid/{attachments_table_stub.js → schema/attachments_table_stub.js} +2 -4
- package/build/src/integrations/lucid/schema/attachments_table_stub.js.map +1 -0
- package/build/src/integrations/lucid/schema/configure_lucid_attachment_tables.d.ts +12 -0
- package/build/src/integrations/lucid/schema/configure_lucid_attachment_tables.d.ts.map +1 -0
- package/build/src/integrations/lucid/schema/configure_lucid_attachment_tables.js +19 -0
- package/build/src/integrations/lucid/schema/configure_lucid_attachment_tables.js.map +1 -0
- package/build/stubs/migrations/attachments_table.stub +7 -25
- package/build/{src/integrations/lucid/render_legacy_attachment_migration_script.js → stubs/migrations/legacy_attachment_migration.stub} +13 -15
- package/build/tests/attachment_provider.spec.js +30 -1
- package/build/tests/attachment_provider.spec.js.map +1 -1
- package/build/tests/{create_legacy_attachment_migration_script.spec.d.ts → attachment_schema_service.spec.d.ts} +1 -1
- package/build/tests/attachment_schema_service.spec.d.ts.map +1 -0
- package/build/tests/attachment_schema_service.spec.js +38 -0
- package/build/tests/attachment_schema_service.spec.js.map +1 -0
- package/build/tests/attachment_table_names.spec.d.ts +8 -0
- package/build/tests/attachment_table_names.spec.d.ts.map +1 -0
- package/build/tests/attachment_table_names.spec.js +36 -0
- package/build/tests/attachment_table_names.spec.js.map +1 -0
- package/build/tests/attachments_table_stub.spec.js +41 -6
- package/build/tests/attachments_table_stub.spec.js.map +1 -1
- package/build/tests/define_config.spec.js +22 -0
- package/build/tests/define_config.spec.js.map +1 -1
- package/build/tests/helpers/lucid_test_database.d.ts.map +1 -1
- package/build/tests/helpers/lucid_test_database.js +16 -7
- package/build/tests/helpers/lucid_test_database.js.map +1 -1
- package/build/tests/legacy_attachment_migration_stub.spec.d.ts +8 -0
- package/build/tests/legacy_attachment_migration_stub.spec.d.ts.map +1 -0
- package/build/tests/legacy_attachment_migration_stub.spec.js +57 -0
- package/build/tests/legacy_attachment_migration_stub.spec.js.map +1 -0
- package/build/tests/lucid_attachment_collection_store.spec.js +5 -4
- package/build/tests/lucid_attachment_collection_store.spec.js.map +1 -1
- package/build/tests/lucid_attachment_lifecycle_service.spec.js +96 -262
- package/build/tests/lucid_attachment_lifecycle_service.spec.js.map +1 -1
- package/build/tests/lucid_attachment_relation.spec.js +103 -24
- package/build/tests/lucid_attachment_relation.spec.js.map +1 -1
- package/build/tests/lucid_attachment_repository.spec.js +1 -1
- package/build/tests/lucid_attachment_repository.spec.js.map +1 -1
- package/build/tests/lucid_attachment_store.spec.js +24 -52
- package/build/tests/lucid_attachment_store.spec.js.map +1 -1
- package/build/tests/lucid_sqlite_integration.spec.js +23 -18
- package/build/tests/lucid_sqlite_integration.spec.js.map +1 -1
- package/build/tests/lucid_variant_generation_service.spec.js +1 -1
- package/build/tests/lucid_variant_generation_service.spec.js.map +1 -1
- package/build/tests/migrate_legacy_attachment.spec.js +48 -43
- package/build/tests/migrate_legacy_attachment.spec.js.map +1 -1
- package/build/tests/migrate_legacy_attachment_records.spec.js +4 -3
- package/build/tests/migrate_legacy_attachment_records.spec.js.map +1 -1
- package/package.json +1 -1
- package/build/src/integrations/lucid/attachment_column.d.ts.map +0 -1
- package/build/src/integrations/lucid/attachment_column.js.map +0 -1
- package/build/src/integrations/lucid/attachment_model.d.ts.map +0 -1
- package/build/src/integrations/lucid/attachment_model.js.map +0 -1
- package/build/src/integrations/lucid/attachment_owner.d.ts.map +0 -1
- package/build/src/integrations/lucid/attachment_owner.js.map +0 -1
- package/build/src/integrations/lucid/attachment_relation.d.ts.map +0 -1
- package/build/src/integrations/lucid/attachment_relation.js +0 -163
- package/build/src/integrations/lucid/attachment_relation.js.map +0 -1
- package/build/src/integrations/lucid/attachments_table_stub.d.ts.map +0 -1
- package/build/src/integrations/lucid/attachments_table_stub.js.map +0 -1
- package/build/src/integrations/lucid/create_legacy_attachment_migration_script.d.ts +0 -13
- package/build/src/integrations/lucid/create_legacy_attachment_migration_script.d.ts.map +0 -1
- package/build/src/integrations/lucid/create_legacy_attachment_migration_script.js +0 -20
- package/build/src/integrations/lucid/create_legacy_attachment_migration_script.js.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.d.ts.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.js.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_repository.d.ts.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_repository.js.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_store.d.ts +0 -36
- package/build/src/integrations/lucid/lucid_attachment_store.d.ts.map +0 -1
- package/build/src/integrations/lucid/lucid_attachment_store.js +0 -179
- package/build/src/integrations/lucid/lucid_attachment_store.js.map +0 -1
- package/build/src/integrations/lucid/lucid_variant_generation_service.d.ts.map +0 -1
- package/build/src/integrations/lucid/lucid_variant_generation_service.js.map +0 -1
- package/build/src/integrations/lucid/migrate_legacy_attachment.d.ts.map +0 -1
- package/build/src/integrations/lucid/migrate_legacy_attachment.js.map +0 -1
- package/build/src/integrations/lucid/migrate_legacy_attachment_records.d.ts.map +0 -1
- package/build/src/integrations/lucid/migrate_legacy_attachment_records.js.map +0 -1
- package/build/src/integrations/lucid/render_legacy_attachment_migration_script.d.ts +0 -11
- package/build/src/integrations/lucid/render_legacy_attachment_migration_script.d.ts.map +0 -1
- package/build/src/integrations/lucid/render_legacy_attachment_migration_script.js.map +0 -1
- package/build/tests/create_legacy_attachment_migration_script.spec.d.ts.map +0 -1
- package/build/tests/create_legacy_attachment_migration_script.spec.js +0 -31
- package/build/tests/create_legacy_attachment_migration_script.spec.js.map +0 -1
- /package/build/src/integrations/lucid/{lucid_variant_generation_service.js → persistence/lucid_variant_generation_service.js} +0 -0
- /package/build/src/integrations/lucid/{attachment_owner.d.ts → relations/attachment_owner.d.ts} +0 -0
- /package/build/src/integrations/lucid/{attachment_owner.js → relations/attachment_owner.js} +0 -0
- /package/build/src/integrations/lucid/{attachments_table_stub.d.ts → schema/attachments_table_stub.d.ts} +0 -0
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
6
|
*/
|
|
7
7
|
import { Database } from '@adonisjs/lucid/database';
|
|
8
|
-
import { AttachmentModel } from '../../src/integrations/lucid/attachment_model.js';
|
|
8
|
+
import { AttachmentModel } from '../../src/integrations/lucid/models/attachment_model.js';
|
|
9
|
+
import { AttachmentLinkModel } from '../../src/integrations/lucid/models/attachment_link_model.js';
|
|
9
10
|
export async function createLucidTestDatabase() {
|
|
10
11
|
const database = new Database({
|
|
11
12
|
connection: 'sqlite',
|
|
@@ -24,13 +25,9 @@ export async function createLucidTestDatabase() {
|
|
|
24
25
|
},
|
|
25
26
|
});
|
|
26
27
|
AttachmentModel.useAdapter(database.modelAdapter());
|
|
28
|
+
AttachmentLinkModel.useAdapter(database.modelAdapter());
|
|
27
29
|
await database.connection().schema.createTable('attachments', (table) => {
|
|
28
30
|
table.string('id').primary();
|
|
29
|
-
table.string('attachable_type').notNullable();
|
|
30
|
-
table.string('attachable_id').notNullable();
|
|
31
|
-
table.string('field').notNullable();
|
|
32
|
-
table.string('owner_key', 64).nullable().unique();
|
|
33
|
-
table.integer('position').unsigned().nullable();
|
|
34
31
|
table.string('parent_id').nullable().references('id').inTable('attachments').onDelete('CASCADE');
|
|
35
32
|
table.string('variant_key').nullable();
|
|
36
33
|
table.string('disk').notNullable();
|
|
@@ -43,10 +40,22 @@ export async function createLucidTestDatabase() {
|
|
|
43
40
|
table.json('metadata').nullable();
|
|
44
41
|
table.timestamp('created_at').notNullable();
|
|
45
42
|
table.timestamp('updated_at').notNullable();
|
|
46
|
-
table.index(['attachable_type', 'attachable_id', 'field']);
|
|
47
43
|
table.index(['parent_id']);
|
|
48
44
|
table.unique(['parent_id', 'variant_key']);
|
|
49
45
|
});
|
|
46
|
+
await database.connection().schema.createTable('attachment_links', (table) => {
|
|
47
|
+
table.string('id').primary();
|
|
48
|
+
table.string('attachable_type').notNullable();
|
|
49
|
+
table.string('attachable_id').notNullable();
|
|
50
|
+
table.string('field').notNullable();
|
|
51
|
+
table.string('owner_key', 64).nullable().unique();
|
|
52
|
+
table.integer('position').unsigned().nullable();
|
|
53
|
+
table.string('attachment_id').notNullable().references('id').inTable('attachments').onDelete('CASCADE');
|
|
54
|
+
table.timestamp('created_at').notNullable();
|
|
55
|
+
table.timestamp('updated_at').notNullable();
|
|
56
|
+
table.index(['attachable_type', 'attachable_id', 'field']);
|
|
57
|
+
table.index(['attachment_id']);
|
|
58
|
+
});
|
|
50
59
|
return database;
|
|
51
60
|
}
|
|
52
61
|
//# sourceMappingURL=lucid_test_database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_test_database.js","sourceRoot":"","sources":["../../../tests/helpers/lucid_test_database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"lucid_test_database.js","sourceRoot":"","sources":["../../../tests/helpers/lucid_test_database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy_attachment_migration_stub.spec.d.ts","sourceRoot":"","sources":["../../tests/legacy_attachment_migration_stub.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jrmc/adonis-attachment
|
|
3
|
+
*
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { test } from '@japa/runner';
|
|
10
|
+
import MakeAttachmentV5Migration from '../commands/make/attachment_v5_migration.js';
|
|
11
|
+
import { stubsRoot } from '../stubs/main.js';
|
|
12
|
+
import { createLegacyAttachmentMigrationStubState } from '../src/integrations/lucid/index.js';
|
|
13
|
+
test.group('legacy attachment migration stub', () => {
|
|
14
|
+
test('prepares a timestamped destination and template state', ({ assert }) => {
|
|
15
|
+
assert.deepEqual(createLegacyAttachmentMigrationStubState({
|
|
16
|
+
directory: '/app/database/scripts',
|
|
17
|
+
defaultDisk: 's3',
|
|
18
|
+
timestamp: 1700000000000,
|
|
19
|
+
}), {
|
|
20
|
+
destination: '/app/database/scripts/1700000000000_migrate_v5_attachments.ts',
|
|
21
|
+
defaultDisk: 's3',
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
test('uses a package stub for the generated data migration', async ({ assert }) => {
|
|
25
|
+
const stub = await readFile(join(stubsRoot, 'migrations/legacy_attachment_migration.stub'), 'utf8');
|
|
26
|
+
assert.include(stub, 'exports({ to: destination })');
|
|
27
|
+
assert.include(stub, "defaultDisk: '{{ defaultDisk }}'");
|
|
28
|
+
assert.include(stub, 'migrateLegacyAttachmentRecords');
|
|
29
|
+
assert.include(stub, 'AttachmentLinkModel.createMany(rows.links');
|
|
30
|
+
});
|
|
31
|
+
test('uses the package stub from the Ace command', async ({ assert }) => {
|
|
32
|
+
const generated = [];
|
|
33
|
+
const messages = [];
|
|
34
|
+
await MakeAttachmentV5Migration.prototype.run.call({
|
|
35
|
+
parsed: { flags: { disk: 's3', folder: 'database/scripts' } },
|
|
36
|
+
app: { makePath: (path) => `/app/${path}` },
|
|
37
|
+
async createCodemods() {
|
|
38
|
+
return {
|
|
39
|
+
async makeUsingStub(root, path, state) {
|
|
40
|
+
generated.push({ root, path, state });
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
logger: {
|
|
45
|
+
success(message) {
|
|
46
|
+
messages.push(message);
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
assert.equal(generated[0]?.root, stubsRoot);
|
|
51
|
+
assert.equal(generated[0]?.path, 'migrations/legacy_attachment_migration.stub');
|
|
52
|
+
assert.equal(generated[0]?.state.defaultDisk, 's3');
|
|
53
|
+
assert.match(String(generated[0]?.state.destination), /^\/app\/database\/scripts\/\d+_migrate_v5_attachments\.ts$/);
|
|
54
|
+
assert.match(messages[0] ?? '', /^Created \/app\/database\/scripts\//);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=legacy_attachment_migration_stub.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy_attachment_migration_stub.spec.js","sourceRoot":"","sources":["../../tests/legacy_attachment_migration_stub.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { test } from '@japa/runner';
|
|
2
|
-
import { LucidAttachmentStore } from '../src/integrations/lucid/lucid_attachment_store.js';
|
|
2
|
+
import { LucidAttachmentStore } from '../src/integrations/lucid/persistence/lucid_attachment_store.js';
|
|
3
3
|
import { createLucidTestDatabase } from './helpers/lucid_test_database.js';
|
|
4
4
|
const owner = { type: 'users', id: 'user-1', field: 'avatars' };
|
|
5
5
|
let database;
|
|
@@ -20,6 +20,7 @@ test.group('Lucid attachment collection store', (group) => {
|
|
|
20
20
|
database = await createLucidTestDatabase();
|
|
21
21
|
});
|
|
22
22
|
group.each.setup(async () => {
|
|
23
|
+
await database.from('attachment_links').delete();
|
|
23
24
|
await database.from('attachments').delete();
|
|
24
25
|
});
|
|
25
26
|
group.teardown(async () => {
|
|
@@ -30,20 +31,20 @@ test.group('Lucid attachment collection store', (group) => {
|
|
|
30
31
|
const first = await store.createCollectionItem(owner, makeAttachment('first'));
|
|
31
32
|
const third = await store.createCollectionItem(owner, makeAttachment('third'));
|
|
32
33
|
const second = await store.createCollectionItem(owner, makeAttachment('second'), 1);
|
|
33
|
-
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.
|
|
34
|
+
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.attachmentId, item.position]), [
|
|
34
35
|
['first', 0],
|
|
35
36
|
['second', 1],
|
|
36
37
|
['third', 2],
|
|
37
38
|
]);
|
|
38
39
|
assert.isNull(await store.findOriginal(owner));
|
|
39
40
|
await store.moveCollectionItem(owner, third.id, 0);
|
|
40
|
-
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.
|
|
41
|
+
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.attachmentId, item.position]), [
|
|
41
42
|
['third', 0],
|
|
42
43
|
['first', 1],
|
|
43
44
|
['second', 2],
|
|
44
45
|
]);
|
|
45
46
|
await store.removeCollectionItem(owner, first);
|
|
46
|
-
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.
|
|
47
|
+
assert.deepEqual((await store.listCollection(owner)).map((item) => [item.attachmentId, item.position]), [
|
|
47
48
|
['third', 0],
|
|
48
49
|
['second', 1],
|
|
49
50
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_attachment_collection_store.spec.js","sourceRoot":"","sources":["../../tests/lucid_attachment_collection_store.spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAGnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"lucid_attachment_collection_store.spec.js","sourceRoot":"","sources":["../../tests/lucid_attachment_collection_store.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { test } from '@japa/runner';
|
|
8
8
|
import { AttachmentService } from '../src/core/attachment_service.js';
|
|
9
|
-
import { LucidAttachmentLifecycleService } from '../src/integrations/lucid/lucid_attachment_lifecycle_service.js';
|
|
9
|
+
import { LucidAttachmentLifecycleService } from '../src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js';
|
|
10
10
|
const attachment = {
|
|
11
11
|
id: 'attachment-id',
|
|
12
12
|
disk: 'public',
|
|
@@ -17,20 +17,66 @@ const attachment = {
|
|
|
17
17
|
extname: 'jpg',
|
|
18
18
|
size: 42,
|
|
19
19
|
};
|
|
20
|
-
function
|
|
20
|
+
function makeBlob(value) {
|
|
21
|
+
return {
|
|
22
|
+
id: value.id,
|
|
23
|
+
toAttachment() {
|
|
24
|
+
return value;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function makeLink(value, id = `link-${value.id}`) {
|
|
29
|
+
const blob = makeBlob(value);
|
|
21
30
|
return {
|
|
22
31
|
id,
|
|
32
|
+
attachmentId: value.id,
|
|
33
|
+
attachment: blob,
|
|
23
34
|
toAttachment() {
|
|
24
35
|
return value;
|
|
25
36
|
},
|
|
26
37
|
};
|
|
27
38
|
}
|
|
39
|
+
function makeStore(overrides = {}) {
|
|
40
|
+
const link = makeLink(attachment);
|
|
41
|
+
return {
|
|
42
|
+
async createOriginal() {
|
|
43
|
+
return link;
|
|
44
|
+
},
|
|
45
|
+
async findOriginal() {
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
async listVariants() {
|
|
49
|
+
return [];
|
|
50
|
+
},
|
|
51
|
+
async releaseOwner() { },
|
|
52
|
+
async restoreOwner() { },
|
|
53
|
+
async remove() {
|
|
54
|
+
return [];
|
|
55
|
+
},
|
|
56
|
+
async createCollectionItem() {
|
|
57
|
+
return link;
|
|
58
|
+
},
|
|
59
|
+
async findCollectionItem() {
|
|
60
|
+
return null;
|
|
61
|
+
},
|
|
62
|
+
async listCollection() {
|
|
63
|
+
return [];
|
|
64
|
+
},
|
|
65
|
+
async moveCollectionItem() {
|
|
66
|
+
return [];
|
|
67
|
+
},
|
|
68
|
+
async removeCollectionItem() {
|
|
69
|
+
return [];
|
|
70
|
+
},
|
|
71
|
+
...overrides,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
28
74
|
test.group('LucidAttachmentLifecycleService', () => {
|
|
29
|
-
test('persists a manager draft before
|
|
75
|
+
test('persists a manager draft before creating its polymorphic link', async ({ assert }) => {
|
|
30
76
|
const events = [];
|
|
31
77
|
const attachments = new AttachmentService({
|
|
32
78
|
defaultDisk: 'fs',
|
|
33
|
-
createId: () =>
|
|
79
|
+
createId: () => attachment.id,
|
|
34
80
|
queue: { async enqueue() { } },
|
|
35
81
|
storage: {
|
|
36
82
|
async write() {
|
|
@@ -42,60 +88,18 @@ test.group('LucidAttachmentLifecycleService', () => {
|
|
|
42
88
|
async remove() { },
|
|
43
89
|
},
|
|
44
90
|
});
|
|
45
|
-
const draft = attachments.createDraft({
|
|
46
|
-
|
|
47
|
-
originalName: 'profile.jpg',
|
|
48
|
-
});
|
|
49
|
-
const service = new LucidAttachmentLifecycleService(attachments, {
|
|
91
|
+
const draft = attachments.createDraft({ body: new Uint8Array([1]), originalName: 'profile.jpg' });
|
|
92
|
+
const service = new LucidAttachmentLifecycleService(attachments, makeStore({
|
|
50
93
|
async createOriginal() {
|
|
51
|
-
events.push('
|
|
52
|
-
return
|
|
53
|
-
},
|
|
54
|
-
async findOriginal() {
|
|
55
|
-
return null;
|
|
56
|
-
},
|
|
57
|
-
async listVariants() {
|
|
58
|
-
return [];
|
|
94
|
+
events.push('link');
|
|
95
|
+
return makeLink(attachment);
|
|
59
96
|
},
|
|
60
|
-
|
|
61
|
-
async restoreOwner() { },
|
|
62
|
-
async remove() { },
|
|
63
|
-
});
|
|
64
|
-
assert.isFalse(draft.isPersisted);
|
|
97
|
+
}));
|
|
65
98
|
await service.attach({ type: 'users', id: '42', field: 'avatar' }, draft);
|
|
66
99
|
assert.isTrue(draft.isPersisted);
|
|
67
|
-
assert.deepEqual(events, ['write', '
|
|
68
|
-
});
|
|
69
|
-
test('persists the file before creating its polymorphic row', async ({ assert }) => {
|
|
70
|
-
const events = [];
|
|
71
|
-
const service = new LucidAttachmentLifecycleService({
|
|
72
|
-
async create() {
|
|
73
|
-
events.push('write');
|
|
74
|
-
return attachment;
|
|
75
|
-
},
|
|
76
|
-
async remove() { },
|
|
77
|
-
}, {
|
|
78
|
-
async createOriginal() {
|
|
79
|
-
events.push('persist');
|
|
80
|
-
return {};
|
|
81
|
-
},
|
|
82
|
-
async findOriginal() {
|
|
83
|
-
return null;
|
|
84
|
-
},
|
|
85
|
-
async listVariants() {
|
|
86
|
-
return [];
|
|
87
|
-
},
|
|
88
|
-
async releaseOwner() { },
|
|
89
|
-
async restoreOwner() { },
|
|
90
|
-
async remove() { },
|
|
91
|
-
});
|
|
92
|
-
await service.attach({ type: 'users', id: '42', field: 'avatar' }, {
|
|
93
|
-
body: new Uint8Array(),
|
|
94
|
-
originalName: 'profile.jpg',
|
|
95
|
-
});
|
|
96
|
-
assert.deepEqual(events, ['write', 'persist']);
|
|
100
|
+
assert.deepEqual(events, ['write', 'link']);
|
|
97
101
|
});
|
|
98
|
-
test('removes a new file when
|
|
102
|
+
test('removes a new file when blob or link persistence fails', async ({ assert }) => {
|
|
99
103
|
const removed = [];
|
|
100
104
|
const service = new LucidAttachmentLifecycleService({
|
|
101
105
|
async create() {
|
|
@@ -104,275 +108,105 @@ test.group('LucidAttachmentLifecycleService', () => {
|
|
|
104
108
|
async remove(value) {
|
|
105
109
|
removed.push(value);
|
|
106
110
|
},
|
|
107
|
-
}, {
|
|
111
|
+
}, makeStore({
|
|
108
112
|
async createOriginal() {
|
|
109
113
|
throw new Error('database unavailable');
|
|
110
114
|
},
|
|
111
|
-
|
|
112
|
-
return null;
|
|
113
|
-
},
|
|
114
|
-
async listVariants() {
|
|
115
|
-
return [];
|
|
116
|
-
},
|
|
117
|
-
async releaseOwner() { },
|
|
118
|
-
async restoreOwner() { },
|
|
119
|
-
async remove() { },
|
|
120
|
-
});
|
|
115
|
+
}));
|
|
121
116
|
await assert.rejects(() => service.attach({ type: 'users', id: '42', field: 'avatar' }, {
|
|
122
117
|
body: new Uint8Array(),
|
|
123
118
|
originalName: 'profile.jpg',
|
|
124
119
|
}), 'database unavailable');
|
|
125
120
|
assert.deepEqual(removed, [attachment]);
|
|
126
121
|
});
|
|
127
|
-
test('replaces
|
|
122
|
+
test('replaces a link before purging its unreferenced blob', async ({ assert }) => {
|
|
128
123
|
const events = [];
|
|
129
124
|
const previousAttachment = { ...attachment, id: 'previous-id', path: 'users/42/previous.jpg' };
|
|
130
125
|
const currentAttachment = { ...attachment, id: 'current-id', path: 'users/42/current.jpg' };
|
|
131
|
-
const previous =
|
|
132
|
-
const current =
|
|
126
|
+
const previous = makeLink(previousAttachment);
|
|
127
|
+
const current = makeLink(currentAttachment);
|
|
133
128
|
const service = new LucidAttachmentLifecycleService({
|
|
134
129
|
async create() {
|
|
135
|
-
events.push('write
|
|
130
|
+
events.push('write');
|
|
136
131
|
return currentAttachment;
|
|
137
132
|
},
|
|
138
133
|
async remove(value) {
|
|
139
134
|
events.push(`remove-file:${value.id}`);
|
|
140
135
|
},
|
|
141
|
-
}, {
|
|
136
|
+
}, makeStore({
|
|
142
137
|
async createOriginal() {
|
|
143
|
-
events.push('
|
|
138
|
+
events.push('create-link');
|
|
144
139
|
return current;
|
|
145
140
|
},
|
|
146
141
|
async findOriginal() {
|
|
147
142
|
return previous;
|
|
148
143
|
},
|
|
149
|
-
async listVariants() {
|
|
150
|
-
return [];
|
|
151
|
-
},
|
|
152
144
|
async releaseOwner() {
|
|
153
|
-
events.push('release-
|
|
145
|
+
events.push('release-link');
|
|
154
146
|
},
|
|
155
|
-
async
|
|
156
|
-
|
|
157
|
-
|
|
147
|
+
async remove() {
|
|
148
|
+
events.push('remove-link');
|
|
149
|
+
return [makeBlob(previousAttachment)];
|
|
158
150
|
},
|
|
159
|
-
});
|
|
160
|
-
|
|
151
|
+
}));
|
|
152
|
+
await service.replace({ type: 'users', id: '42', field: 'avatar' }, {
|
|
161
153
|
body: new Uint8Array(),
|
|
162
154
|
originalName: 'profile.jpg',
|
|
163
155
|
});
|
|
164
|
-
assert.equal(row, current);
|
|
165
156
|
assert.deepEqual(events, [
|
|
166
|
-
'write
|
|
167
|
-
'release-
|
|
168
|
-
'
|
|
169
|
-
'remove-
|
|
157
|
+
'write',
|
|
158
|
+
'release-link',
|
|
159
|
+
'create-link',
|
|
160
|
+
'remove-link',
|
|
170
161
|
'remove-file:previous-id',
|
|
171
162
|
]);
|
|
172
163
|
});
|
|
173
|
-
test('
|
|
174
|
-
const events = [];
|
|
175
|
-
const previous = makeRow(attachment, 'previous-id');
|
|
176
|
-
const currentAttachment = { ...attachment, id: 'current-id', path: 'users/42/current.jpg' };
|
|
177
|
-
const service = new LucidAttachmentLifecycleService({
|
|
178
|
-
async create() {
|
|
179
|
-
events.push('write-current');
|
|
180
|
-
return currentAttachment;
|
|
181
|
-
},
|
|
182
|
-
async remove(value) {
|
|
183
|
-
events.push(`remove-file:${value.id}`);
|
|
184
|
-
},
|
|
185
|
-
}, {
|
|
186
|
-
async createOriginal() {
|
|
187
|
-
throw new Error('database unavailable');
|
|
188
|
-
},
|
|
189
|
-
async findOriginal() {
|
|
190
|
-
return previous;
|
|
191
|
-
},
|
|
192
|
-
async listVariants() {
|
|
193
|
-
return [];
|
|
194
|
-
},
|
|
195
|
-
async releaseOwner() {
|
|
196
|
-
events.push('release-previous');
|
|
197
|
-
},
|
|
198
|
-
async restoreOwner() {
|
|
199
|
-
events.push('restore-previous');
|
|
200
|
-
},
|
|
201
|
-
async remove() { },
|
|
202
|
-
});
|
|
203
|
-
await assert.rejects(() => service.replace({ type: 'users', id: '42', field: 'avatar' }, {
|
|
204
|
-
body: new Uint8Array(),
|
|
205
|
-
originalName: 'profile.jpg',
|
|
206
|
-
}), 'database unavailable');
|
|
207
|
-
assert.deepEqual(events, [
|
|
208
|
-
'write-current',
|
|
209
|
-
'release-previous',
|
|
210
|
-
'restore-previous',
|
|
211
|
-
'remove-file:current-id',
|
|
212
|
-
]);
|
|
213
|
-
});
|
|
214
|
-
test('detaches the original and every persisted variant', async ({ assert }) => {
|
|
215
|
-
const removedRows = [];
|
|
216
|
-
const removedFiles = [];
|
|
217
|
-
const original = makeRow(attachment);
|
|
218
|
-
const variant = makeRow({ ...attachment, id: 'variant-id', path: 'users/42/thumbnail.webp' });
|
|
219
|
-
const service = new LucidAttachmentLifecycleService({
|
|
220
|
-
async create() {
|
|
221
|
-
return attachment;
|
|
222
|
-
},
|
|
223
|
-
async remove(value) {
|
|
224
|
-
removedFiles.push(value.id);
|
|
225
|
-
},
|
|
226
|
-
}, {
|
|
227
|
-
async createOriginal() {
|
|
228
|
-
return original;
|
|
229
|
-
},
|
|
230
|
-
async findOriginal() {
|
|
231
|
-
return original;
|
|
232
|
-
},
|
|
233
|
-
async listVariants() {
|
|
234
|
-
return [variant];
|
|
235
|
-
},
|
|
236
|
-
async releaseOwner() { },
|
|
237
|
-
async restoreOwner() { },
|
|
238
|
-
async remove(row) {
|
|
239
|
-
removedRows.push(row.id);
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
await service.detach({ type: 'users', id: '42', field: 'avatar' });
|
|
243
|
-
assert.deepEqual(removedRows, ['attachment-id']);
|
|
244
|
-
assert.sameDeepMembers(removedFiles, ['attachment-id', 'variant-id']);
|
|
245
|
-
});
|
|
246
|
-
test('persists a collection item before inserting its polymorphic row', async ({ assert }) => {
|
|
247
|
-
const events = [];
|
|
248
|
-
const item = makeRow(attachment);
|
|
249
|
-
const service = new LucidAttachmentLifecycleService({
|
|
250
|
-
async create() {
|
|
251
|
-
events.push('write');
|
|
252
|
-
return attachment;
|
|
253
|
-
},
|
|
254
|
-
async remove() { },
|
|
255
|
-
}, {
|
|
256
|
-
async createOriginal() {
|
|
257
|
-
return item;
|
|
258
|
-
},
|
|
259
|
-
async findOriginal() {
|
|
260
|
-
return null;
|
|
261
|
-
},
|
|
262
|
-
async listVariants() {
|
|
263
|
-
return [];
|
|
264
|
-
},
|
|
265
|
-
async releaseOwner() { },
|
|
266
|
-
async restoreOwner() { },
|
|
267
|
-
async remove() { },
|
|
268
|
-
async createCollectionItem() {
|
|
269
|
-
events.push('persist');
|
|
270
|
-
return item;
|
|
271
|
-
},
|
|
272
|
-
async findCollectionItem() {
|
|
273
|
-
return null;
|
|
274
|
-
},
|
|
275
|
-
async listCollection() {
|
|
276
|
-
return [];
|
|
277
|
-
},
|
|
278
|
-
async moveCollectionItem() {
|
|
279
|
-
return [];
|
|
280
|
-
},
|
|
281
|
-
async removeCollectionItem() { },
|
|
282
|
-
});
|
|
283
|
-
await service.add({ type: 'users', id: '42', field: 'avatars' }, {
|
|
284
|
-
body: new Uint8Array(),
|
|
285
|
-
originalName: 'profile.jpg',
|
|
286
|
-
});
|
|
287
|
-
assert.deepEqual(events, ['write', 'persist']);
|
|
288
|
-
});
|
|
289
|
-
test('removes a collection file when its database insertion fails', async ({ assert }) => {
|
|
164
|
+
test('only removes files for blobs that became unreferenced', async ({ assert }) => {
|
|
290
165
|
const removed = [];
|
|
291
166
|
const service = new LucidAttachmentLifecycleService({
|
|
292
167
|
async create() {
|
|
293
168
|
return attachment;
|
|
294
169
|
},
|
|
295
170
|
async remove(value) {
|
|
296
|
-
removed.push(value);
|
|
297
|
-
},
|
|
298
|
-
}, {
|
|
299
|
-
async createOriginal() {
|
|
300
|
-
return makeRow(attachment);
|
|
171
|
+
removed.push(value.id);
|
|
301
172
|
},
|
|
173
|
+
}, makeStore({
|
|
302
174
|
async findOriginal() {
|
|
303
|
-
return
|
|
304
|
-
},
|
|
305
|
-
async listVariants() {
|
|
306
|
-
return [];
|
|
307
|
-
},
|
|
308
|
-
async releaseOwner() { },
|
|
309
|
-
async restoreOwner() { },
|
|
310
|
-
async remove() { },
|
|
311
|
-
async createCollectionItem() {
|
|
312
|
-
throw new Error('database unavailable');
|
|
313
|
-
},
|
|
314
|
-
async findCollectionItem() {
|
|
315
|
-
return null;
|
|
175
|
+
return makeLink(attachment);
|
|
316
176
|
},
|
|
317
|
-
async
|
|
177
|
+
async remove() {
|
|
318
178
|
return [];
|
|
319
179
|
},
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
async removeCollectionItem() { },
|
|
324
|
-
});
|
|
325
|
-
await assert.rejects(() => service.add({ type: 'users', id: '42', field: 'avatars' }, {
|
|
326
|
-
body: new Uint8Array(),
|
|
327
|
-
originalName: 'profile.jpg',
|
|
328
|
-
}), 'database unavailable');
|
|
329
|
-
assert.deepEqual(removed, [attachment]);
|
|
180
|
+
}));
|
|
181
|
+
await service.detach({ type: 'users', id: '42', field: 'avatar' });
|
|
182
|
+
assert.deepEqual(removed, []);
|
|
330
183
|
});
|
|
331
|
-
test('removes
|
|
332
|
-
const
|
|
333
|
-
const
|
|
334
|
-
const item = makeRow(attachment);
|
|
335
|
-
const variant = makeRow({ ...attachment, id: 'variant-id', path: 'users/42/thumbnail.webp' });
|
|
184
|
+
test('adds and removes ordered collection links', async ({ assert }) => {
|
|
185
|
+
const item = makeLink(attachment);
|
|
186
|
+
const removed = [];
|
|
336
187
|
const service = new LucidAttachmentLifecycleService({
|
|
337
188
|
async create() {
|
|
338
189
|
return attachment;
|
|
339
190
|
},
|
|
340
191
|
async remove(value) {
|
|
341
|
-
|
|
192
|
+
removed.push(value.id);
|
|
342
193
|
},
|
|
343
|
-
}, {
|
|
344
|
-
async createOriginal() {
|
|
345
|
-
return item;
|
|
346
|
-
},
|
|
347
|
-
async findOriginal() {
|
|
348
|
-
return null;
|
|
349
|
-
},
|
|
350
|
-
async listVariants() {
|
|
351
|
-
return [variant];
|
|
352
|
-
},
|
|
353
|
-
async releaseOwner() { },
|
|
354
|
-
async restoreOwner() { },
|
|
355
|
-
async remove() { },
|
|
194
|
+
}, makeStore({
|
|
356
195
|
async createCollectionItem() {
|
|
357
196
|
return item;
|
|
358
197
|
},
|
|
359
198
|
async findCollectionItem() {
|
|
360
199
|
return item;
|
|
361
200
|
},
|
|
362
|
-
async
|
|
363
|
-
return [
|
|
364
|
-
},
|
|
365
|
-
async moveCollectionItem() {
|
|
366
|
-
return [item];
|
|
201
|
+
async removeCollectionItem() {
|
|
202
|
+
return [makeBlob(attachment)];
|
|
367
203
|
},
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
assert.
|
|
374
|
-
assert.deepEqual(removedRows, ['attachment-id']);
|
|
375
|
-
assert.sameDeepMembers(removedFiles, ['attachment-id', 'variant-id']);
|
|
204
|
+
}));
|
|
205
|
+
const added = await service.add({ type: 'users', id: '42', field: 'gallery' }, { body: new Uint8Array(), originalName: 'profile.jpg' });
|
|
206
|
+
const didRemove = await service.removeCollectionItem({ type: 'users', id: '42', field: 'gallery' }, added.id);
|
|
207
|
+
assert.equal(added.id, item.id);
|
|
208
|
+
assert.isTrue(didRemove);
|
|
209
|
+
assert.deepEqual(removed, [attachment.id]);
|
|
376
210
|
});
|
|
377
211
|
});
|
|
378
212
|
//# sourceMappingURL=lucid_attachment_lifecycle_service.spec.js.map
|