diff --git a/admin/app/models/curated_collection_resource.ts b/admin/app/models/curated_collection_resource.ts index 03e44a1..0b43dd0 100644 --- a/admin/app/models/curated_collection_resource.ts +++ b/admin/app/models/curated_collection_resource.ts @@ -6,6 +6,14 @@ import type { BelongsTo } from '@adonisjs/lucid/types/relations' export default class CuratedCollectionResource extends BaseModel { static namingStrategy = new SnakeCaseNamingStrategy() + static indexes = [ + { + name: 'curated_collection_resources_unique', + columns: ['curated_collection_slug', 'url'], + unique: true, + }, + ] + @column({ isPrimary: true }) declare id: number diff --git a/admin/app/services/map_service.ts b/admin/app/services/map_service.ts index 2a9eea7..b745510 100644 --- a/admin/app/services/map_service.ts +++ b/admin/app/services/map_service.ts @@ -286,18 +286,26 @@ export class MapService implements IMapService { }) for (const collection of validated.collections) { - const collectionResult = await CuratedCollection.updateOrCreate( - { slug: collection.slug }, + const { resources, ...restCollection } = collection; // we'll handle resources separately + + // Upsert the collection itself + await CuratedCollection.updateOrCreate( + { slug: restCollection.slug }, { - ...collection, + ...restCollection, type: 'map', } ) - logger.info(`[MapService] Upserted curated collection: ${collection.slug}`) + logger.info(`[MapService] Upserted curated collection: ${restCollection.slug}`) + + // Upsert collection's resources + const resourcesResult = await CuratedCollectionResource.updateOrCreateMany('url', resources.map((res) => ({ + ...res, + curated_collection_slug: restCollection.slug, // add the foreign key + }))) - await collectionResult.related('resources').createMany(collection.resources) logger.info( - `[MapService] Upserted ${collection.resources.length} resources for collection: ${collection.slug}` + `[MapService] Upserted ${resourcesResult.length} resources for collection: ${restCollection.slug}` ) } diff --git a/admin/database/migrations/1770269324176_add_unique_constraint_to_curated_collection_resources_table.ts b/admin/database/migrations/1770269324176_add_unique_constraint_to_curated_collection_resources_table.ts new file mode 100644 index 0000000..08879c9 --- /dev/null +++ b/admin/database/migrations/1770269324176_add_unique_constraint_to_curated_collection_resources_table.ts @@ -0,0 +1,19 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'curated_collection_resources' + + async up() { + this.schema.alterTable(this.tableName, (table) => { + table.unique(['curated_collection_slug', 'url'], { + indexName: 'curated_collection_resources_unique', + }) + }) + } + + async down() { + this.schema.alterTable(this.tableName, (table) => { + table.dropUnique(['curated_collection_slug', 'url'], 'curated_collection_resources_unique') + }) + } +} \ No newline at end of file