diff --git a/app/controllers/user_controller.ts b/app/controllers/user_controller.ts index 5a9524c..35f83c8 100644 --- a/app/controllers/user_controller.ts +++ b/app/controllers/user_controller.ts @@ -1,7 +1,8 @@ import { SubjectService } from '#services/subject_service' -import { updateUserValidator } from '#validators/user' +import { updateUserValidator, matchStudentValidator, mergeStudentValidator } from '#validators/user' import { inject } from '@adonisjs/core' import type { HttpContext } from '@adonisjs/core/http' +import User from '#models/user' @inject() export default class UserController { @@ -54,4 +55,32 @@ export default class UserController { data: user, } } + + // GET /match-student + async matchStudent({ request, response }: HttpContext) { + const { firstName, lastName, classId } = await request.validateUsing(matchStudentValidator) + + const user = await User.query() + .where('firstName', firstName) + .andWhere('lastName', lastName) + .andWhere('className', classId) + .first() + + if (!user) { + return response.notFound({ message: 'User not found' }) + } + + return { success: true, data: user } + } + + // POST /merge-student + async mergeStudent({ request, auth }: HttpContext) { + const user = auth.user! + const { pastStudentId } = await request.validateUsing(mergeStudentValidator) + + user.pastStudentId = pastStudentId + await user.save() + + return { success: true, data: user } + } } diff --git a/app/models/user.ts b/app/models/user.ts index 403f8f7..cf8b507 100644 --- a/app/models/user.ts +++ b/app/models/user.ts @@ -8,6 +8,9 @@ export default class User extends BaseModel { @column({ isPrimary: true }) declare id: number + @column() + declare pastStudentId: number | null + @column() declare className: string diff --git a/app/validators/user.ts b/app/validators/user.ts index 7b64edf..d9bf6f6 100644 --- a/app/validators/user.ts +++ b/app/validators/user.ts @@ -11,3 +11,17 @@ export const updateUserValidator = vine.compile( ), }) ) + +export const matchStudentValidator = vine.compile( + vine.object({ + firstName: vine.string(), + lastName: vine.string(), + classId: vine.string(), + }) +) + +export const mergeStudentValidator = vine.compile( + vine.object({ + pastStudentId: vine.number(), + }) +) diff --git a/database/migrations/1771971856851_create_add_past_student_id_to_users_table.ts b/database/migrations/1771971856851_create_add_past_student_id_to_users_table.ts new file mode 100644 index 0000000..09cf38b --- /dev/null +++ b/database/migrations/1771971856851_create_add_past_student_id_to_users_table.ts @@ -0,0 +1,18 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'add_past_student_id_to_users' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + + table.timestamp('created_at') + table.timestamp('updated_at') + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} \ No newline at end of file diff --git a/start/routes.ts b/start/routes.ts index b749daf..0bc8ab9 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -39,6 +39,8 @@ router const UserController = () => import('#controllers/user_controller') router.get('/users/@me', [UserController, 'me']).use(middleware.auth()) router.post('/users/@me', [UserController, 'update']).use(middleware.auth()) +router.get('/match-student', [UserController, 'matchStudent']).use(middleware.auth()) +router.post('/merge-student', [UserController, 'mergeStudent']).use(middleware.auth()) const SubjectsController = () => import('#controllers/subjects_controller') router.get('/subjects', [SubjectsController, 'index']).use(middleware.auth())