diff --git a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts index 9315569e912f7acb2ef0084bf926e90c0d56d9a0..9ece43dcc31b2dd9fde697a33948f6d72fc15247 100644 --- a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts +++ b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts @@ -1,8 +1,7 @@ -import { Prisma } from '@prisma/client'; -import Config from '../../../config/Config'; -import LazyVal from '../../../shared/helpers/LazyVal'; -import GitlabUser from '../../../shared/types/Gitlab/GitlabUser'; -import GitlabManager from '../../../managers/GitlabManager'; +import { Prisma, UserRole } from '@prisma/client'; +import LazyVal from '../../../shared/helpers/LazyVal'; +import GitlabUser from '../../../shared/types/Gitlab/GitlabUser'; +import GitlabManager from '../../../managers/GitlabManager'; export default Prisma.defineExtension(client => { @@ -14,16 +13,21 @@ export default Prisma.defineExtension(client => { role: true }, compute(user) { - return Config.permissions.teachingStaff.includes(user.role!); + return user.role == UserRole.TEACHING_STAFF || user.role == UserRole.ADMIN; } }, - gitlabProfile : { + isAdmin : { needs: { - gitlabId: true + role: true }, + compute(user) { + return user.role == UserRole.ADMIN; + } + }, + gitlabProfile : { compute(user) { return new LazyVal<GitlabUser | undefined>(() => { - return GitlabManager.getUserById(user.gitlabId); + return GitlabManager.getUserById(user.id); }); } } diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index fca3977ce07f14eada038511f9106ccf539fba0a..b057966d5d504aaf64e54e91194859d8fe91536e 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -142,7 +142,7 @@ class GitlabManager { }; members.forEach(member => { if ( member.access_level >= GitlabAccessLevel.REPORTER ) { - if ( member.id === req.session.profile.gitlabId ) { + if ( member.id === req.session.profile.id ) { isUsersAtLeastReporter.user = true; } else if ( member.id === Config.gitlab.account.id ) { isUsersAtLeastReporter.dojo = true; diff --git a/ExpressAPI/src/managers/UserManager.ts b/ExpressAPI/src/managers/UserManager.ts index 615cbcb37cb5c5b6ec06731c50a1acd391260956..b69705e1e6b5c65c29efe2a0590b27b7a51c48b2 100644 --- a/ExpressAPI/src/managers/UserManager.ts +++ b/ExpressAPI/src/managers/UserManager.ts @@ -1,7 +1,8 @@ -import GitlabUser from '../shared/types/Gitlab/GitlabUser'; -import { Prisma } from '@prisma/client'; -import db from '../helpers/DatabaseHelper'; -import { User } from '../types/DatabaseTypes'; +import GitlabUser from '../shared/types/Gitlab/GitlabUser'; +import { Prisma } from '@prisma/client'; +import db from '../helpers/DatabaseHelper'; +import GitlabProfile from '../shared/types/Gitlab/GitlabProfile'; +import { User } from '../types/DatabaseTypes'; class UserManager { @@ -23,23 +24,36 @@ class UserManager { }) as unknown as User ?? undefined; } - async getByGitlabId(gitlabId: number, returnIdIfUndefined: boolean = true, include: Prisma.UserInclude | undefined = undefined): Promise<User | number | undefined> { - return await db.user.findUnique({ - where : { - gitlabId: gitlabId - }, - include: include - }) as unknown as User ?? (returnIdIfUndefined ? gitlabId : undefined); + async getUpdateFromGitlabProfile(gitlabProfile: GitlabProfile, refreshToken: string): Promise<User> { + await db.user.upsert({ + where : { + id: gitlabProfile.id + }, + update: { + mail : gitlabProfile.email, + gitlabLastInfo: gitlabProfile + }, + create: { + id : gitlabProfile.id, + name : gitlabProfile.name, + mail : gitlabProfile.email, + gitlabUsername: gitlabProfile.username, + gitlabLastInfo: gitlabProfile, + deleted : false + } + }); + + return (await this.getById(gitlabProfile.id))!; } async getFromGitlabUser(gitlabUser: GitlabUser, createIfNotExist: boolean = false, include: Prisma.UserInclude | undefined = undefined): Promise<User | number | undefined> { - let user = await this.getByGitlabId(gitlabUser.id, true, include); + let user = await this.getById(gitlabUser.id, include) ?? gitlabUser.id; if ( typeof user === 'number' && createIfNotExist ) { user = (await db.user.create({ data: { - firstname: gitlabUser.name, - gitlabId : gitlabUser.id + id : gitlabUser.id, + gitlabUsername: gitlabUser.name } })).id; } diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index 0e8926263d792b77a20c60ca36b1c64134a5f3d5..709342bae618ff290480160efb852976eab2f63a 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -136,11 +136,11 @@ class AssignmentRoutes implements RoutesManager { connectOrCreate: [ ...params.members.map(gitlabUser => { return { create: { - gitlabId : gitlabUser.id, - firstname: gitlabUser.name + id : gitlabUser.id, + gitlabUsername: gitlabUser.name }, where : { - gitlabId: gitlabUser.id + id: gitlabUser.id } }; }) ] diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts index e773d8c2f08c1484a830a28edb962e4031d9de73..8eab4ee47e9b6f8fcaa4605f77ed800dc72605ba 100644 --- a/ExpressAPI/src/routes/ExerciseRoutes.ts +++ b/ExpressAPI/src/routes/ExerciseRoutes.ts @@ -135,7 +135,7 @@ class ExerciseRoutes implements RoutesManager { } try { - await Promise.all([ ...new Set([ ...assignment.staff.map(user => user.gitlabId), ...params.members.map(member => member.id) ]) ].map(async (memberId: number): Promise<GitlabMember | false> => { + await Promise.all([ ...new Set([ ...assignment.staff.map(user => user.id), ...params.members.map(member => member.id) ]) ].map(async (memberId: number): Promise<GitlabMember | false> => { try { return await GitlabManager.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.DEVELOPER); } catch ( e ) { @@ -158,11 +158,11 @@ class ExerciseRoutes implements RoutesManager { connectOrCreate: [ ...params.members.map(gitlabUser => { return { create: { - gitlabId : gitlabUser.id, - firstname: gitlabUser.name + id : gitlabUser.id, + gitlabUsername: gitlabUser.name }, where : { - gitlabId: gitlabUser.id + id: gitlabUser.id } }; }) ] diff --git a/ExpressAPI/src/types/DatabaseTypes.ts b/ExpressAPI/src/types/DatabaseTypes.ts index bdb25f8c14088d4dcc8524f309a52d5380556a1c..91b3389d79d81d26cbbb7c93c0e9511dcf3143e4 100644 --- a/ExpressAPI/src/types/DatabaseTypes.ts +++ b/ExpressAPI/src/types/DatabaseTypes.ts @@ -26,9 +26,10 @@ const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({ }); -export type User = Omit<Prisma.UserGetPayload<typeof userBase>, 'password'> & { - password?: string +export type User = Omit<Prisma.UserGetPayload<typeof userBase>, 'gitlabLastRefreshToken'> & { + gitlabLastRefreshToken?: string isTeachingStaff: boolean + isAdmin: boolean gitlabProfile: LazyVal<GitlabUser> } export type Assignment = Prisma.AssignmentGetPayload<typeof assignmentBase>