From 31f22d382e201a6f1cac72fa1b6e651a527d48b9 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sun, 28 Apr 2024 23:25:01 +0200 Subject: [PATCH] fix: relations between tables --- app/middleware/auth_middleware.ts | 9 ++++--- app/models/user.ts | 6 +++++ .../1714218548323_create_users_table.ts | 2 +- .../1714253983443_create_collections_table.ts | 14 ++++++++--- .../1714254076754_create_links_table.ts | 14 ++++++++--- ...326455367_create_collection_links_table.ts | 24 +++++++++++++++++++ 6 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 database/migrations/1714326455367_create_collection_links_table.ts diff --git a/app/middleware/auth_middleware.ts b/app/middleware/auth_middleware.ts index 2597271..359d88e 100644 --- a/app/middleware/auth_middleware.ts +++ b/app/middleware/auth_middleware.ts @@ -1,6 +1,7 @@ +import PATHS from '#constants/paths'; +import type { Authenticators } from '@adonisjs/auth/types'; import type { HttpContext } from '@adonisjs/core/http'; import type { NextFn } from '@adonisjs/core/types/http'; -import type { Authenticators } from '@adonisjs/auth/types'; /** * Auth middleware is used authenticate HTTP requests and deny @@ -10,7 +11,7 @@ export default class AuthMiddleware { /** * The URL to redirect to, when authentication fails */ - redirectTo = '/login'; + redirectTo = PATHS.AUTH.LOGIN; async handle( ctx: HttpContext, @@ -19,7 +20,9 @@ export default class AuthMiddleware { guards?: (keyof Authenticators)[]; } = {} ) { - await ctx.auth.authenticateUsing(options.guards, { loginRoute: this.redirectTo }); + await ctx.auth.authenticateUsing(options.guards, { + loginRoute: this.redirectTo, + }); return next(); } } diff --git a/app/models/user.ts b/app/models/user.ts index cb19d47..a683997 100644 --- a/app/models/user.ts +++ b/app/models/user.ts @@ -1,4 +1,5 @@ import Collection from '#models/collection'; +import Link from '#models/link'; import type { GoogleToken } from '@adonisjs/ally/types'; import { column, manyToMany } from '@adonisjs/lucid/orm'; import type { ManyToMany } from '@adonisjs/lucid/types/relations'; @@ -30,4 +31,9 @@ export default class User extends AppBaseModel { relatedKey: 'authorId', }) declare collections: ManyToMany; + + @manyToMany(() => Link, { + relatedKey: 'authorId', + }) + declare links: ManyToMany; } diff --git a/database/migrations/1714218548323_create_users_table.ts b/database/migrations/1714218548323_create_users_table.ts index a65e692..cd80911 100644 --- a/database/migrations/1714218548323_create_users_table.ts +++ b/database/migrations/1714218548323_create_users_table.ts @@ -5,7 +5,7 @@ export default class extends BaseSchema { async up() { this.schema.createTable(this.tableName, (table) => { - table.uuid('id').notNullable(); + table.uuid('id').unique().notNullable(); table.string('email', 254).notNullable().unique(); table.string('name', 254).notNullable(); diff --git a/database/migrations/1714253983443_create_collections_table.ts b/database/migrations/1714253983443_create_collections_table.ts index db831a3..e29ab8b 100644 --- a/database/migrations/1714253983443_create_collections_table.ts +++ b/database/migrations/1714253983443_create_collections_table.ts @@ -8,12 +8,20 @@ export default class extends BaseSchema { async up() { this.schema.raw(`DROP TYPE IF EXISTS ${this.visibilityEnumName}`); this.schema.createTable(this.tableName, (table) => { - table.uuid('id').notNullable(); + table.uuid('id').unique().notNullable(); table.string('name', 254).notNullable(); table.string('description', 254); - table.uuid('next_id').defaultTo(null); - table.uuid('author_id').notNullable(); + table + .uuid('next_id') + .references('id') + .inTable('collections') + .defaultTo(null); + table + .uuid('author_id') + .references('id') + .inTable('users') + .onDelete('CASCADE'); table.enum('visibility', Object.values(Visibility), { useNative: true, enumName: this.visibilityEnumName, diff --git a/database/migrations/1714254076754_create_links_table.ts b/database/migrations/1714254076754_create_links_table.ts index 2ee0e24..981768e 100644 --- a/database/migrations/1714254076754_create_links_table.ts +++ b/database/migrations/1714254076754_create_links_table.ts @@ -5,14 +5,22 @@ export default class extends BaseSchema { async up() { this.schema.createTable(this.tableName, (table) => { - table.uuid('id').notNullable(); + table.uuid('id').unique().notNullable(); table.string('name', 254).notNullable(); table.string('description', 254); table.text('url').notNullable(); table.boolean('favorite').notNullable().defaultTo(0); - table.uuid('collection_id').notNullable(); - table.uuid('author_id').notNullable(); + table + .uuid('collection_id') + .references('id') + .inTable('collections') + .onDelete('CASCADE'); + table + .uuid('author_id') + .references('id') + .inTable('users') + .onDelete('CASCADE'); table.timestamp('created_at'); table.timestamp('updated_at'); diff --git a/database/migrations/1714326455367_create_collection_links_table.ts b/database/migrations/1714326455367_create_collection_links_table.ts new file mode 100644 index 0000000..93a0ed6 --- /dev/null +++ b/database/migrations/1714326455367_create_collection_links_table.ts @@ -0,0 +1,24 @@ +import { BaseSchema } from '@adonisjs/lucid/schema'; + +export default class extends BaseSchema { + protected tableName = 'collection_link'; + + async up() { + this.schema.createTable(this.tableName, (table) => { + table + .uuid('collection_id') + .references('id') + .inTable('collections') + .onDelete('CASCADE'); + table + .uuid('link_id') + .references('id') + .inTable('links') + .onDelete('CASCADE'); + }); + } + + async down() { + this.schema.dropTable(this.tableName); + } +}