From e4a802d5f205a8fb332461bd130f4610b66b6f2e Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 18 May 2025 13:05:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Configure=20addons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.ts | 30 +++++++++++-------- config/auth.ts | 3 +- config/cache.ts | 20 ++++++++----- config/cors.ts | 3 +- config/database.ts | 2 +- config/drive.ts | 6 ++-- config/limiter.ts | 8 ++--- config/mail.ts | 17 +++++------ config/redis.ts | 2 +- .../1747564644339_create_users_table.ts | 8 ++--- ...5698713_create_remember_me_tokens_table.ts | 26 ++++++++++++++++ start/env.ts | 11 ++++--- 12 files changed, 87 insertions(+), 49 deletions(-) create mode 100644 database/migrations/1747565698713_create_remember_me_tokens_table.ts diff --git a/app/models/user.ts b/app/models/user.ts index ce4b0b8..1e8deef 100644 --- a/app/models/user.ts +++ b/app/models/user.ts @@ -1,30 +1,36 @@ import { DateTime } from 'luxon' -import hash from '@adonisjs/core/services/hash' -import { compose } from '@adonisjs/core/helpers' import { BaseModel, column } from '@adonisjs/lucid/orm' -import { withAuthFinder } from '@adonisjs/auth/mixins/lucid' +import { DbRememberMeTokensProvider } from '@adonisjs/auth/session' -const AuthFinder = withAuthFinder(() => hash.use('scrypt'), { - uids: ['email'], - passwordColumnName: 'password', -}) +export default class User extends BaseModel { + static rememberMeTokens = DbRememberMeTokensProvider.forModel(User) -export default class User extends compose(BaseModel, AuthFinder) { @column({ isPrimary: true }) declare id: number + @column({ serializeAs: 'class', serialize: serializeClass }) + declare classId: number + @column() - declare fullName: string | null + declare firstName: string + + @column() + declare lastName: string @column() declare email: string - @column({ serializeAs: null }) - declare password: string + @column() + declare avatar: string @column.dateTime({ autoCreate: true }) declare createdAt: DateTime @column.dateTime({ autoCreate: true, autoUpdate: true }) declare updatedAt: DateTime | null -} \ No newline at end of file +} + +// TODO +function serializeClass(classId: number): string { + return 'class_' + classId +} diff --git a/config/auth.ts b/config/auth.ts index 80d6bf9..212bfed 100644 --- a/config/auth.ts +++ b/config/auth.ts @@ -6,7 +6,8 @@ const authConfig = defineConfig({ default: 'web', guards: { web: sessionGuard({ - useRememberMeTokens: false, + useRememberMeTokens: true, + rememberMeTokensAge: '2 years', provider: sessionUserProvider({ model: () => import('#models/user') }), diff --git a/config/cache.ts b/config/cache.ts index a443049..72c42f5 100644 --- a/config/cache.ts +++ b/config/cache.ts @@ -1,4 +1,3 @@ -import env from '#start/env' import { defineConfig, store, drivers } from '@adonisjs/cache' const cacheConfig = defineConfig({ @@ -9,16 +8,21 @@ const cacheConfig = defineConfig({ default: store() .useL1Layer(drivers.memory()) - - .useL2Layer(drivers.redis({ - connectionName: 'main', - })) - - } + .useL2Layer( + drivers.redis({ + connectionName: 'main', + }) + ) + .useBus( + drivers.redisBus({ + connectionName: 'main', + }) + ), + }, }) export default cacheConfig declare module '@adonisjs/cache/types' { interface CacheStores extends InferStores {} -} \ No newline at end of file +} diff --git a/config/cors.ts b/config/cors.ts index b431ed4..6366820 100644 --- a/config/cors.ts +++ b/config/cors.ts @@ -8,6 +8,7 @@ import { defineConfig } from '@adonisjs/cors' */ const corsConfig = defineConfig({ enabled: true, + // TODO: Only same domain origin: true, methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'], headers: true, @@ -16,4 +17,4 @@ const corsConfig = defineConfig({ maxAge: 90, }) -export default corsConfig \ No newline at end of file +export default corsConfig diff --git a/config/database.ts b/config/database.ts index cdd2d3d..a97bc71 100644 --- a/config/database.ts +++ b/config/database.ts @@ -21,4 +21,4 @@ const dbConfig = defineConfig({ }, }) -export default dbConfig \ No newline at end of file +export default dbConfig diff --git a/config/drive.ts b/config/drive.ts index d4baa4c..5086e27 100644 --- a/config/drive.ts +++ b/config/drive.ts @@ -9,12 +9,12 @@ const driveConfig = defineConfig({ * The services object can be used to configure multiple file system * services each using the same or a different driver. */ - services: { + services: { fs: services.fs({ location: app.makePath('storage'), serveFiles: true, routeBasePath: '/uploads', - visibility: 'public', + visibility: 'private' }), }, }) @@ -23,4 +23,4 @@ export default driveConfig declare module '@adonisjs/drive/types' { export interface DriveDisks extends InferDriveDisks {} -} \ No newline at end of file +} diff --git a/config/limiter.ts b/config/limiter.ts index 978d65d..0e15208 100644 --- a/config/limiter.ts +++ b/config/limiter.ts @@ -4,7 +4,6 @@ import { defineConfig, stores } from '@adonisjs/limiter' const limiterConfig = defineConfig({ default: env.get('LIMITER_STORE'), stores: { - /** * Redis store to save rate limiting data inside a * redis database. @@ -13,13 +12,12 @@ const limiterConfig = defineConfig({ * the limiter connection. */ redis: stores.redis({}), - - + /** * Memory store could be used during * testing */ - memory: stores.memory({}) + memory: stores.memory({}), }, }) @@ -27,4 +25,4 @@ export default limiterConfig declare module '@adonisjs/limiter/types' { export interface LimitersList extends InferLimiters {} -} \ No newline at end of file +} diff --git a/config/mail.ts b/config/mail.ts index c17c174..b9ffa90 100644 --- a/config/mail.ts +++ b/config/mail.ts @@ -4,18 +4,17 @@ import { defineConfig, transports } from '@adonisjs/mail' const mailConfig = defineConfig({ default: 'mailgun', - /** - * The mailers object can be used to configure multiple mailers - * each using a different transport or same transport with different - * options. + /** + * The mailers object can be used to configure multiple mailers + * each using a different transport or same transport with different + * options. */ - mailers: { + mailers: { mailgun: transports.mailgun({ - key: env.get('MAILGUN_API_KEY'), + key: env.get('MAILGUN_API_KEY')!, baseUrl: 'https://api.mailgun.net/v3', - domain: env.get('MAILGUN_DOMAIN'), + domain: env.get('MAILGUN_DOMAIN')!, }), - }, }) @@ -23,4 +22,4 @@ export default mailConfig declare module '@adonisjs/mail/types' { export interface MailersList extends InferMailers {} -} \ No newline at end of file +} diff --git a/config/redis.ts b/config/redis.ts index d933221..f287ab0 100644 --- a/config/redis.ts +++ b/config/redis.ts @@ -33,4 +33,4 @@ export default redisConfig declare module '@adonisjs/redis/types' { export interface RedisConnections extends InferConnections {} -} \ No newline at end of file +} diff --git a/database/migrations/1747564644339_create_users_table.ts b/database/migrations/1747564644339_create_users_table.ts index d6a6798..a25df05 100644 --- a/database/migrations/1747564644339_create_users_table.ts +++ b/database/migrations/1747564644339_create_users_table.ts @@ -6,10 +6,10 @@ export default class extends BaseSchema { async up() { this.schema.createTable(this.tableName, (table) => { table.increments('id').notNullable() - table.string('full_name').nullable() + table.integer('class_id').notNullable() + table.string('first_name', 80).notNullable() + table.string('last_name', 80).notNullable() table.string('email', 254).notNullable().unique() - table.string('password').notNullable() - table.timestamp('created_at').notNullable() table.timestamp('updated_at').nullable() }) @@ -18,4 +18,4 @@ export default class extends BaseSchema { async down() { this.schema.dropTable(this.tableName) } -} \ No newline at end of file +} diff --git a/database/migrations/1747565698713_create_remember_me_tokens_table.ts b/database/migrations/1747565698713_create_remember_me_tokens_table.ts new file mode 100644 index 0000000..8d3ec82 --- /dev/null +++ b/database/migrations/1747565698713_create_remember_me_tokens_table.ts @@ -0,0 +1,26 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'remember_me_tokens' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments() + table + .integer('tokenable_id') + .notNullable() + .unsigned() + .references('id') + .inTable('users') + .onDelete('CASCADE') + table.string('hash').notNullable().unique() + table.timestamp('created_at').notNullable() + table.timestamp('updated_at').notNullable() + table.timestamp('expires_at').notNullable() + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} \ No newline at end of file diff --git a/start/env.ts b/start/env.ts index 26d4e2f..71c5140 100644 --- a/start/env.ts +++ b/start/env.ts @@ -48,12 +48,15 @@ export default await Env.create(new URL('../', import.meta.url), { | Variables for configuring the mail package |---------------------------------------------------------- */ - SMTP_HOST: Env.schema.string(), - SMTP_PORT: Env.schema.string(), + // MAILGUN_API_KEY: Env.schema.string(), + // MAILGUN_DOMAIN: Env.schema.string() + /* + |---------------------------------------------------------- + | Variables for configuring the redis package + |---------------------------------------------------------- + */ REDIS_HOST: Env.schema.string({ format: 'host' }), REDIS_PORT: Env.schema.number(), REDIS_PASSWORD: Env.schema.string.optional(), - MAILGUN_API_KEY: Env.schema.string(), - MAILGUN_DOMAIN: Env.schema.string() })