diff --git a/src/helpers/user.helpers.ts b/src/helpers/user.helpers.ts index fbe3fdaf..294bc82b 100644 --- a/src/helpers/user.helpers.ts +++ b/src/helpers/user.helpers.ts @@ -1,6 +1,22 @@ import { GraphQLError } from 'graphql' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Context } from './../context' +import * as jwt from 'jsonwebtoken' + + +const SECRET: string = process.env.SECRET ?? 'test_secret' + +export const generateToken = (userId: string, role: string) => { + return jwt.sign({ userId, role }, SECRET, { expiresIn: '2h' }) +} +export const generateTokenUserExists = (email: string) => { + return jwt.sign({ email }, SECRET, { expiresIn: '2d' }) +} +export const generateTokenOrganization = (name: string) => { + return jwt.sign({ name }, SECRET, { expiresIn: '336h' }) +} + +export const emailExpression = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ export async function checkUserLoggedIn( context: Context @@ -24,7 +40,7 @@ export async function checkUserLoggedIn( }) } - return (inputRoles: Array = ['admin']) => { + return (inputRoles: Array = [RoleOfUser.ADMIN]) => { if (inputRoles && !inputRoles.includes(role as string)) { throw new GraphQLError( `Request ${inputRoles.join(' or ')} permission!!`, diff --git a/src/models/invitation.model.ts b/src/models/invitation.model.ts index 342c3e86..231527de 100644 --- a/src/models/invitation.model.ts +++ b/src/models/invitation.model.ts @@ -1,4 +1,5 @@ import mongoose, { Schema } from 'mongoose' +import { RoleOfUser } from './user' const STATUS = { PENDING: 'pending', @@ -8,10 +9,10 @@ const STATUS = { } const ROLE = { - TRAINEE: 'trainee', - ADMIN: 'admin', - TTL: 'ttl', - COORDINATOR: 'coordinator', + TRAINEE: RoleOfUser.TRAINEE, + ADMIN: RoleOfUser.ADMIN, + TTL: RoleOfUser.TTL, + COORDINATOR: RoleOfUser.COORDINATOR, } const InvitationSchema = new Schema({ inviterId: { diff --git a/src/models/user.ts b/src/models/user.ts index 397fa20d..e602d6e8 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -22,6 +22,14 @@ export interface UserInterface { emailNotifications: boolean; } +export enum RoleOfUser { + TRAINEE = 'trainee', + COORDINATOR = 'coordinator', + MANAGER = 'manager', + ADMIN = 'admin', + SUPER_ADMIN = 'superAdmin', + TTL = 'ttl', +} mongoose.set('toJSON', { virtuals: true, versionKey: false, diff --git a/src/resolvers/attendance.resolvers.ts b/src/resolvers/attendance.resolvers.ts index 2bdc93f1..203a792b 100644 --- a/src/resolvers/attendance.resolvers.ts +++ b/src/resolvers/attendance.resolvers.ts @@ -6,7 +6,7 @@ import mongoose, { Error, Types } from 'mongoose' import { checkUserLoggedIn } from '../helpers/user.helpers' import { pushNotification } from '../utils/notification/pushNotification' import Phase from '../models/phase.model' -import { User, UserInterface } from '../models/user' +import { RoleOfUser, User, UserInterface } from '../models/user' import Team from '../models/team.model' import { CohortInterface } from '../models/cohort.model' import { GraphQLError } from 'graphql' @@ -111,7 +111,7 @@ const attendanceResolver = { { traineeEmail }: any, context: Context ) { - ;(await checkUserLoggedIn(context))(['trainee']) + ;(await checkUserLoggedIn(context))([RoleOfUser.TRAINEE]) const attendance = await Attendance.find() const weeklyAttendance = attendance.map((week: any) => { @@ -130,8 +130,8 @@ const attendanceResolver = { { team }: { team: string }, context: Context ) { - ;(await checkUserLoggedIn(context))(['coordinator']) - const { userId } = (await checkUserLoggedIn(context))(['coordinator']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR]) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR]) const teamData = await Team.findById(team) @@ -143,8 +143,8 @@ const attendanceResolver = { }, async getAttendanceStats(_: any, args: any, context: Context) { - ;(await checkUserLoggedIn(context))(['coordinator']) - const { userId } = (await checkUserLoggedIn(context))(['coordinator']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR]) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR]) const attendances: any = await Attendance.find({ coordinatorId: userId }) //calculate statistic @@ -490,4 +490,4 @@ const attendanceResolver = { }, } -export default attendanceResolver +export default attendanceResolver \ No newline at end of file diff --git a/src/resolvers/cohort.resolvers.ts b/src/resolvers/cohort.resolvers.ts index f8eb9df5..f4c78e02 100644 --- a/src/resolvers/cohort.resolvers.ts +++ b/src/resolvers/cohort.resolvers.ts @@ -5,7 +5,7 @@ import { checkUserLoggedIn } from '../helpers/user.helpers' import Cohort from '../models/cohort.model' import Program from '../models/program.model' import Phase from '../models/phase.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' import { Context } from './../context' import { ProgramType } from './program.resolvers' @@ -32,14 +32,14 @@ const resolvers = { try { // some validations const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, ]) // get the organization if a superAdmin logs in let org - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { org = await checkLoggedInOrganization(orgToken) } @@ -49,12 +49,12 @@ const resolvers = { return ( await Cohort.find().populate({ path: 'program', - match: role === 'manager' && managerMatch, + match: role === RoleOfUser.MANAGER && managerMatch, model: Program, strictPopulate: false, populate: { path: 'organization', - match: role === 'admin' && adminMatch, + match: role === RoleOfUser.ADMIN && adminMatch, model: Organization, strictPopulate: false, }, @@ -101,7 +101,7 @@ const resolvers = { } = args // some validations - ;(await checkUserLoggedIn(context))(['superAdmin', 'admin', 'manager']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN, RoleOfUser.MANAGER]) const coordinator = await User.findOne({ email: coordinatorEmail, }) @@ -213,10 +213,10 @@ const resolvers = { } = args const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) const coordinator = await User.findOne({ email: coordinatorEmail, @@ -294,7 +294,7 @@ const resolvers = { }) } - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (cohortOrg.id.toString() !== org.id.toString()) { @@ -307,7 +307,7 @@ const resolvers = { } ) } - if (role === 'admin' && !cohortOrg?.admin?.includes(userId)) { + if (role === RoleOfUser.ADMIN && !cohortOrg?.admin?.includes(userId)) { throw new GraphQLError( `Cohort with id "${id}" doesn't exist in your organization`, { @@ -318,7 +318,7 @@ const resolvers = { ) } if ( - role === 'manager' && + role === RoleOfUser.MANAGER && cohortProgram?.manager?.toString() !== userId?.toString() ) { throw new GraphQLError( @@ -331,7 +331,7 @@ const resolvers = { ) } if ( - role === 'coordinator' && + role === RoleOfUser.COORDINATOR && cohort?.coordinator?.toString() !== userId?.toString() ) { throw new GraphQLError('You are not assigned this cohort!', { @@ -410,9 +410,9 @@ const resolvers = { }, deleteCohort: async (_: any, { id, orgToken }: any, context: Context) => { const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, ]) const cohort = await Cohort.findById(id).populate({ @@ -433,7 +433,7 @@ const resolvers = { const cohortProgram = cohort.program as ProgramType const cohortOrg = cohortProgram.organization as OrganizationType - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (cohortOrg.id.toString() !== org.id.toString()) { @@ -447,7 +447,7 @@ const resolvers = { ) } if ( - role === 'admin' && + role === RoleOfUser.ADMIN && cohortOrg.admin.toString() !== userId?.toString() ) { throw new GraphQLError( @@ -460,7 +460,7 @@ const resolvers = { ) } if ( - role === 'manager' && + role === RoleOfUser.MANAGER && cohortProgram?.manager?.toString() !== userId?.toString() ) { throw new GraphQLError( diff --git a/src/resolvers/coordinatorResolvers.ts b/src/resolvers/coordinatorResolvers.ts index 8eea76ea..0d67f6c2 100644 --- a/src/resolvers/coordinatorResolvers.ts +++ b/src/resolvers/coordinatorResolvers.ts @@ -9,7 +9,7 @@ import { Organization } from '../models/organization.model' import { Profile } from '../models/profile.model' import Program from '../models/program.model' import Team from '../models/team.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { pushNotification } from '../utils/notification/pushNotification' import { sendEmail } from '../utils/sendEmail' import generalTemplate from '../utils/templates/generalTemplate' @@ -40,11 +40,11 @@ const manageStudentResolvers = { getAllCoordinators: async (_: any, { orgToken }: any, context: Context) => { try { // coordinator validation - ;(await checkUserLoggedIn(context))(['admin', 'manager', 'coordinator']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.MANAGER, RoleOfUser.COORDINATOR]) const selectedOrganization = await checkLoggedInOrganization(orgToken) // Fetch coordinators based on the role const coordinators = await User.find({ - role: 'coordinator', + role: RoleOfUser.COORDINATOR, organizations: selectedOrganization.name, }) return coordinators || [] @@ -65,10 +65,10 @@ const manageStudentResolvers = { try { // coordinator validation ;(await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) const org: InstanceType = @@ -95,18 +95,18 @@ const manageStudentResolvers = { getTrainees: async (_: any, { orgToken }: any, context: Context) => { try { const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', - 'ttl', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, + RoleOfUser.TTL, ]) const org: InstanceType = await checkLoggedInOrganization(orgToken) const query: any = { - role: 'trainee', + role: RoleOfUser.TRAINEE, organizations: org.name, } @@ -139,18 +139,18 @@ const manageStudentResolvers = { }, }, }) - if (role === 'ttl') { + if (role === RoleOfUser.TTL) { return trainees } return trainees.filter((user: any) => { - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { return ( user.team?.cohort?.program?.organization.name == org?.name && user.team?.cohort?.program?.organization.admin.includes(userId) ) } - if (role === 'manager') { + if (role === RoleOfUser.MANAGER) { return ( user.team?.cohort?.program?.organization.name == org?.name && JSON.stringify(user.team?.cohort?.program?.manager).replace( @@ -159,7 +159,7 @@ const manageStudentResolvers = { ) == userId ) } - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { return ( user.team?.cohort?.program?.organization.name == org?.name && JSON.stringify(user.team?.cohort?.coordinator).replace( @@ -188,10 +188,10 @@ const manageStudentResolvers = { try { // coordinator validation const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', - 'coordinator', - 'ttl', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, + RoleOfUser.TTL, ]) // get the organization if someone logs in @@ -221,14 +221,14 @@ const manageStudentResolvers = { }, }) ).filter((user: any) => { - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { return ( user.team?.cohort?.name == cohort && user.team?.cohort?.program?.organization.name == org?.name && user.team?.cohort?.program?.organization.admin.includes(userId) ) } - if (role === 'manager') { + if (role === RoleOfUser.MANAGER) { return ( user.team?.cohort?.name == cohort && user.team?.cohort?.program?.organization.name == org?.name && @@ -238,7 +238,7 @@ const manageStudentResolvers = { ) == userId ) } - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { return ( user.team?.cohort?.name == cohort && user.team?.cohort?.program?.organization.name == org?.name && @@ -262,21 +262,21 @@ const manageStudentResolvers = { async getCohorts(_: any, { orgToken }: any, context: any) { // coordinator validation const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', - 'coordinator', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) // get the organization if someone logs in const org: InstanceType = await checkLoggedInOrganization(orgToken) - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { const allCohorts = await Cohort.find({ coordinator: context.userId, }).populate({ path: 'program', - match: role === 'coordinator', + match: role === RoleOfUser.COORDINATOR, strictPopulate: false, populate: { path: 'organization', @@ -293,7 +293,7 @@ const manageStudentResolvers = { const allCohorts = await Cohort.find({}).populate({ path: 'program', - match: role === 'coordinator', + match: role === RoleOfUser.COORDINATOR, strictPopulate: false, populate: { path: 'organization', @@ -301,20 +301,20 @@ const manageStudentResolvers = { }, }) return allCohorts.filter((cohort: any) => { - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { return ( cohort.program?.organization.name == org?.name && cohort.program?.organization?.admin.includes(userId) ) } - if (role === 'manager') { + if (role === RoleOfUser.MANAGER) { return ( cohort.program?.organization.name == org?.name && JSON.stringify(cohort.program?.manager).replace(/['"]+/g, '') == userId ) } - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { return ( cohort.program?.organization.name == org?.name && JSON.stringify(cohort.coordinator).replace(/['"]+/g, '') == userId @@ -332,9 +332,9 @@ const manageStudentResolvers = { try { // coordinator validation const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', - 'coordinator', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) // get the organization if someone logs in @@ -431,7 +431,7 @@ const manageStudentResolvers = { if (!user.team) { // add trainee to attendance - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { const attendanceRecords: any = Attendance.find({ coordinatorId: userId, }) @@ -554,8 +554,8 @@ const manageStudentResolvers = { try { // coordinator validation const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'coordinator', + RoleOfUser.ADMIN, + RoleOfUser.COORDINATOR, ]) // traineeId: String!, reason: String!, date: DateTime!, these are the arges am getting from the resolver @@ -579,7 +579,7 @@ const manageStudentResolvers = { ) // Send a notification to the admin - const admin = await User.findOne({ role: 'admin' }) // Assuming there's a single admin + const admin = await User.findOne({ role: RoleOfUser.ADMIN }) // Assuming there's a single admin if (admin && trainee) { await pushNotification( admin._id, @@ -605,9 +605,9 @@ const manageStudentResolvers = { ) { // coordinator validation const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', - 'coordinator', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) // get the organization if someone logs in @@ -660,7 +660,7 @@ const manageStudentResolvers = { if (memberCheck[0].toString() == checkMember.id.toString()) { // remove trainee to attendance - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { const traineeAttendance: any = await Attendance.findOne({ coordinatorId: userId, }) @@ -735,7 +735,7 @@ const manageStudentResolvers = { context: Context ) { // Coordinator validation - ;(await checkUserLoggedIn(context))(['admin', 'manager', 'coordinator']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.MANAGER, RoleOfUser.COORDINATOR]) // Get the organization if someone logs in const org: InstanceType = @@ -818,8 +818,8 @@ const manageStudentResolvers = { async inviteUser(_: any, { email, orgToken, type }: any, context: any) { const { userId, role } = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, ]) // get the organization if someone logs in @@ -847,10 +847,10 @@ const manageStudentResolvers = { 'Invitation', content, someSpace, - role === 'manager' + role === RoleOfUser.MANAGER ? process.env.MANAGER_EMAIL : process.env.ADMIN_EMAIL, - role === 'manager' + role === RoleOfUser.MANAGER ? process.env.MANAGER_PASSWORD : process.env.ADMIN_PASS ) @@ -867,7 +867,7 @@ async function sendEmailOnMembershipActions( user: any, content: string ) { - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { const organization: any = await Organization.findOne({ _id: org.id, }) @@ -889,7 +889,7 @@ async function sendEmailOnMembershipActions( } } - if (role === 'manager') { + if (role === RoleOfUser.MANAGER) { const program: any = await Program.findOne({ manager: userId }) if (!program) { throw new Error('You dont\'t have a program yet') @@ -913,7 +913,7 @@ async function sendEmailOnMembershipActions( } } - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { const cohort: any = await Cohort.findOne({ coordinator: userId }) if (!cohort) { throw new Error('You don\'t have a coordinator yet') diff --git a/src/resolvers/createRatingSystemresolver.ts b/src/resolvers/createRatingSystemresolver.ts index dec4fd3e..c2a705c9 100644 --- a/src/resolvers/createRatingSystemresolver.ts +++ b/src/resolvers/createRatingSystemresolver.ts @@ -2,12 +2,13 @@ import { systemRating } from '../models/ratingSystem' import { Context } from './../context' import { checkUserLoggedIn } from '../helpers/user.helpers' import { checkLoggedInOrganization } from '../helpers/organization.helper' +import { RoleOfUser } from '../models/user' const createRatingSystemresolver = { Query: { async getRatingSystems(_: any, { orgToken }: any, context: Context) { const org = await checkLoggedInOrganization(orgToken) - ;(await checkUserLoggedIn(context))(['admin', 'superAdmin', 'manager']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.SUPER_ADMIN, RoleOfUser.MANAGER]) const ratingSystems = await systemRating.find({ organization: org._id }) return ratingSystems @@ -31,7 +32,7 @@ const createRatingSystemresolver = { { name, grade, description, percentage, orgToken }: any, context: { role: string; userId: string } ) { - ;(await checkUserLoggedIn(context))(['admin', 'superAdmin', 'manager']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.SUPER_ADMIN, RoleOfUser.MANAGER]) const ratingSystemExists = await systemRating.findOne({ name: name, diff --git a/src/resolvers/invitation.resolvers.ts b/src/resolvers/invitation.resolvers.ts index 7f296314..f88e6a85 100644 --- a/src/resolvers/invitation.resolvers.ts +++ b/src/resolvers/invitation.resolvers.ts @@ -5,7 +5,7 @@ import { IResolvers } from '@graphql-tools/utils' import { checkUserLoggedIn } from '../helpers/user.helpers' import { checkLoggedInOrganization } from '../helpers/organization.helper' import { sendEmail } from '../utils/sendEmail' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import sendInvitationEmail from '../helpers/sendInvitaitonEmail' import sendCancelInvitationEmail from '../helpers/cancelInvitationEmail' import jwt from 'jsonwebtoken' @@ -16,10 +16,10 @@ import generateInvitationTokenAndLink from '../helpers/generateInvitationToken.h const SECRET: string = process.env.SECRET ?? 'test_secret' const ROLE = { - TRAINEE: 'trainee', - ADMIN: 'admin', - TTL: 'ttl', - COORDINATOR: 'coordinator', + TRAINEE: RoleOfUser.TRAINEE, + ADMIN: RoleOfUser.ADMIN, + TTL: RoleOfUser.TTL, + COORDINATOR: RoleOfUser.COORDINATOR, } as const export type Role = typeof ROLE[keyof typeof ROLE] @@ -41,7 +41,7 @@ const invitationResolvers: IResolvers = { context ) => { try { - const { userId } = (await checkUserLoggedIn(context))(['admin']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) if (!userId) { throw new GraphQLError('User is not logged in', { extensions: { @@ -102,7 +102,7 @@ const invitationResolvers: IResolvers = { context ) => { try { - const { userId } = (await checkUserLoggedIn(context))(['admin']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) if (!userId) { throw new GraphQLError('User is not logged in', { extensions: { @@ -177,7 +177,7 @@ const invitationResolvers: IResolvers = { }: { file: any; orgName: string; orgToken: string }, context: any ) { - const { userId } = (await checkUserLoggedIn(context))(['admin']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) if (!userId) { throw new GraphQLError('User is not logged in', { extensions: { @@ -266,7 +266,7 @@ const invitationResolvers: IResolvers = { context: any ) { try { - const { userId } = (await checkUserLoggedIn(context))(['admin']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) if (!userId) { throw new GraphQLError('User is not logged in', { extensions: { @@ -339,7 +339,7 @@ const invitationResolvers: IResolvers = { { invitationId }: { invitationId: string }, context: any ) { - const { userId } = (await checkUserLoggedIn(context))(['admin']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) if (!userId) { throw new GraphQLError('User is not logged in', { extensions: { diff --git a/src/resolvers/notification.resolvers.ts b/src/resolvers/notification.resolvers.ts index 3c94dc23..5d1af81f 100644 --- a/src/resolvers/notification.resolvers.ts +++ b/src/resolvers/notification.resolvers.ts @@ -1,7 +1,7 @@ import { Notification } from '../models/notification.model' import { Context } from './../context' import { checkUserLoggedIn } from '../helpers/user.helpers' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { PubSub, withFilter } from 'graphql-subscriptions' import { Query } from 'mongoose' import { Profile } from '../models/profile.model' @@ -58,7 +58,7 @@ const notificationResolver = { }, Mutation: { deleteNotifications: async (parent: any, args: any, context: Context) => { - ;(await checkUserLoggedIn(context))(['coordinator', 'trainee']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR, RoleOfUser.TRAINEE]) const findNotification = await Notification.findById(args.id) if (!findNotification) throw new Error('The notification you want to delete does not exist') @@ -69,13 +69,13 @@ const notificationResolver = { }, markAsRead: async (parent: any, args: any, context: Context) => { ;(await checkUserLoggedIn(context))([ - 'coordinator', - 'trainee', - 'superAdmin', - 'manager', - 'ttl', + RoleOfUser.COORDINATOR, + RoleOfUser.TRAINEE, + RoleOfUser.SUPER_ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.TTL, 'user', - 'admin', + RoleOfUser.ADMIN, ]) const findNotification = await Notification.findById(args.id) if (!findNotification) @@ -89,7 +89,7 @@ const notificationResolver = { return 'successfully updated notification' }, markAllAsRead: async (parent: any, args: any, context: Context) => { - ;(await checkUserLoggedIn(context))(['coordinator', 'trainee']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR, RoleOfUser.TRAINEE]) const { userId } = context const findNotification = await Notification.find({ receiver: userId }) if (!findNotification) diff --git a/src/resolvers/phase.resolver.ts b/src/resolvers/phase.resolver.ts index 5a57858f..d96ab87b 100644 --- a/src/resolvers/phase.resolver.ts +++ b/src/resolvers/phase.resolver.ts @@ -5,13 +5,14 @@ import { Context } from './../context' import { OrganizationType } from './userResolver' import Phase from '../models/phase.model' import Cohort from '../models/cohort.model' +import { RoleOfUser } from '../models/user' const phaseResolver = { Query: { getAllPhases: async (_: any, { orgToken }: any, context: Context) => { const org = await checkLoggedInOrganization(orgToken) - ;(await checkUserLoggedIn(context))(['admin', 'coordinator']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.COORDINATOR]) const allphases = await Phase.find({ organization: org }) @@ -30,7 +31,7 @@ const phaseResolver = { context: Context ) => { try { - ;(await checkUserLoggedIn(context))(['superAdmin', 'admin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN]) const { name, description, orgToken } = args const org = await checkLoggedInOrganization(orgToken) @@ -64,9 +65,9 @@ const phaseResolver = { context: Context ) => { const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, ]) // get the phase and its organization from the id and checks if it exists @@ -90,7 +91,7 @@ const phaseResolver = { } // check if a given user have priviledges to update this phase - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (phaseOrg.id.toString() !== org.id.toString()) { @@ -103,7 +104,7 @@ const phaseResolver = { } ) } - if (role === 'admin' && phaseOrg.admin.toString() !== userId) { + if (role === RoleOfUser.ADMIN && phaseOrg.admin.toString() !== userId) { throw new GraphQLError( `Phase with id "${phase?.id}" doesn't exist in your organization`, { @@ -124,7 +125,7 @@ const phaseResolver = { }, async deletePhase(parent: any, args: any, context: Context) { - ;(await checkUserLoggedIn(context))(['superAdmin', 'admin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN]) const findPhase = await Phase.findById(args.id) const findPhaseInCohort = await Cohort.findOne({ phase: args.id }) diff --git a/src/resolvers/profileResolver.ts b/src/resolvers/profileResolver.ts index 8abbe20e..c13e6bcc 100644 --- a/src/resolvers/profileResolver.ts +++ b/src/resolvers/profileResolver.ts @@ -1,7 +1,7 @@ import { Context } from '../context' import { checkLoggedInOrganization } from '../helpers/organization.helper' import { checkUserLoggedIn } from '../helpers/user.helpers' -import { User, UserRole } from '../models/user' +import { RoleOfUser, User, UserRole } from '../models/user' import { Profile } from '../models/profile.model' import { sendEmail } from '../utils/sendEmail' @@ -23,10 +23,10 @@ const profileResolvers: any = { context: Context ) => { ;(await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'trainee', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.TRAINEE, + RoleOfUser.COORDINATOR, ]) const org = await checkLoggedInOrganization(args.orgToken) const users = await User.find({ @@ -34,12 +34,12 @@ const profileResolvers: any = { role: { $in: [ 'user', - 'coordinator', - 'manager', - 'admin', - 'trainee', + RoleOfUser.COORDINATOR, + RoleOfUser.MANAGER, + RoleOfUser.ADMIN, + RoleOfUser.TRAINEE, 'user', - 'ttl', + RoleOfUser.TTL, ], }, }).populate({ @@ -72,17 +72,17 @@ const profileResolvers: any = { context: Context ) => { ;(await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'trainee', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.TRAINEE, + RoleOfUser.COORDINATOR, ]) const org = await checkLoggedInOrganization(args.orgToken) const users = await User.find({ organizations: org?.name, - role: 'ttl', // Filter users with role "TTL" + role: RoleOfUser.TTL, // Filter users with role "TTL" }) .populate({ path: 'team', @@ -112,7 +112,7 @@ const profileResolvers: any = { context: Context ) => { // Ensure the user is logged in and has the 'ttl' role - if (context.role !== 'ttl') { + if (context.role !== RoleOfUser.TTL) { throw new Error('You must be logged in as a TTL to view trainees.') } @@ -123,7 +123,7 @@ const profileResolvers: any = { const ttlUser = await User.findOne({ _id: context.userId, // Assuming userId uniquely identifies users organizations: org?.name, - role: 'ttl', + role: RoleOfUser.TTL, }) .populate('team') .exec() @@ -140,7 +140,7 @@ const profileResolvers: any = { // Find all trainees in the same team as the TTL const traineesInSameTeam = await User.find({ team: ttlUser.team, // Assuming the team field represents the team of a user - role: 'trainee', // Filter users with role "trainee" + role: RoleOfUser.TRAINEE, // Filter users with role "trainee" }) .populate({ path: 'team', @@ -253,7 +253,7 @@ const profileResolvers: any = { { email, reason }: { email: string; reason: string }, context: Context ) => { - ;(await checkUserLoggedIn(context))(['admin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN]) const user = await User.findOne({ email, role: 'ttl' }).exec() if (!user) { throw new Error('TTL user not found') diff --git a/src/resolvers/program.resolvers.ts b/src/resolvers/program.resolvers.ts index a96d9c04..15dc4c03 100644 --- a/src/resolvers/program.resolvers.ts +++ b/src/resolvers/program.resolvers.ts @@ -3,7 +3,7 @@ import { ObjectId } from 'mongodb' import { checkLoggedInOrganization } from '../helpers/organization.helper' import { checkUserLoggedIn } from '../helpers/user.helpers' import Program from '../models/program.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' import { Context } from './../context' import { OrganizationType } from './userResolver' @@ -15,12 +15,12 @@ const resolvers = { getAllPrograms: async (_: any, { orgToken }: any, context: Context) => { try { const { role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, ]) let org let where: any = { active: true } - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { org = await checkLoggedInOrganization(orgToken) where = { ...where, organization: org.id } } @@ -37,7 +37,7 @@ const resolvers = { }, getProgram: async (_: any, { orgToken }: any, context: Context) => { try { - const { userId } = (await checkUserLoggedIn(context))(['manager']) + const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.MANAGER]) const org = await checkLoggedInOrganization(orgToken) return Program.findOne({ @@ -67,7 +67,7 @@ const resolvers = { context: Context ) => { try { - ;(await checkUserLoggedIn(context))(['superAdmin', 'admin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN]) const { name, description, managerEmail, orgToken } = args @@ -114,9 +114,9 @@ const resolvers = { context: Context ) => { const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, ]) // get the program and its organization from the id and checks if it exists @@ -151,7 +151,7 @@ const resolvers = { } // check if a given user have priviledges to update this program - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (programOrg.id.toString() !== org.id.toString()) { @@ -164,7 +164,7 @@ const resolvers = { } ) } - if (role === 'admin' && !programOrg.admin.includes(userId)) { + if (role === RoleOfUser.ADMIN && !programOrg.admin.includes(userId)) { throw new GraphQLError( `Program with id "${program?.id}" doesn't exist in your organization`, { @@ -174,7 +174,7 @@ const resolvers = { } ) } - if (role === 'manager' && program.manager.toString() !== userId) { + if (role === RoleOfUser.MANAGER && program.manager.toString() !== userId) { throw new GraphQLError( 'You are not assigned this program', @@ -197,8 +197,8 @@ const resolvers = { }, deleteProgram: async (_: any, { id, orgToken }: any, context: Context) => { const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, ]) const program = await Program.findById(id).populate('organization') @@ -211,7 +211,7 @@ const resolvers = { } const deleteOrganization = program?.organization as OrganizationType - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (deleteOrganization.id.toString() !== org.id.toString()) { diff --git a/src/resolvers/ratingsResolvers.ts b/src/resolvers/ratingsResolvers.ts index 3b61777f..e6cd485f 100644 --- a/src/resolvers/ratingsResolvers.ts +++ b/src/resolvers/ratingsResolvers.ts @@ -1,5 +1,5 @@ import { Rating, TempData } from '../models/ratings' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' import { sendEmails } from '../utils/sendEmails' import { Context } from './../context' @@ -100,7 +100,7 @@ const ratingResolvers: any = { path: 'members', populate: { path: 'program', - match: context.role === 'coordinator', + match: context.role === RoleOfUser.COORDINATOR, strictPopulate: false, populate: { path: 'organization', @@ -114,10 +114,10 @@ const ratingResolvers: any = { async fetchRatingByCohort(_: any, { CohortName }: any, context: Context) { ;(await checkUserLoggedIn(context))([ - 'coordinator', - 'admin', - 'trainee', - 'ttl', + RoleOfUser.COORDINATOR, + RoleOfUser.ADMIN, + RoleOfUser.TRAINEE, + RoleOfUser.TTL, ]) return ( await Rating.find({}).populate([ @@ -147,7 +147,7 @@ const ratingResolvers: any = { path: 'members', populate: { path: 'program', - match: context.role === 'coordinator', + match: context.role === RoleOfUser.COORDINATOR, strictPopulate: false, populate: { path: 'organization', @@ -178,7 +178,7 @@ const ratingResolvers: any = { }, Mutation: { addRatings: authenticated( - validateTtlOrCoordinator(['coordinator', 'ttl'])( + validateTtlOrCoordinator([RoleOfUser.COORDINATOR, RoleOfUser.TTL])( async ( root, { @@ -306,7 +306,7 @@ const ratingResolvers: any = { return 'The rating table has been deleted successfully' }, updateRating: authenticated( - validateTtlOrCoordinator(['coordinator', 'ttl'])( + validateTtlOrCoordinator([RoleOfUser.COORDINATOR, RoleOfUser.TTL])( async ( root, { @@ -419,7 +419,7 @@ const ratingResolvers: any = { ) // Send a notification to the admin - const admin = await User.findOne({ role: 'admin' }) + const admin = await User.findOne({ role: RoleOfUser.ADMIN }) if (admin) { await pushNotification( admin._id, @@ -436,7 +436,7 @@ const ratingResolvers: any = { ), approveRating: authenticated( - validateRole('admin')(async (root, { user, sprint }) => { + validateRole(RoleOfUser.ADMIN)(async (root, { user, sprint }) => { const updatedData = await TempData.findOne({ user: user, sprint: sprint, @@ -623,7 +623,7 @@ const ratingResolvers: any = { }, rejectRating: authenticated( - validateRole('admin')(async (root, { user, sprint }) => { + validateRole(RoleOfUser.ADMIN)(async (root, { user, sprint }) => { const updatedData: any = await TempData.findOne({ user: user, sprint: sprint, diff --git a/src/resolvers/reply.resolver.ts b/src/resolvers/reply.resolver.ts index 17ac5edb..832ed950 100644 --- a/src/resolvers/reply.resolver.ts +++ b/src/resolvers/reply.resolver.ts @@ -1,6 +1,6 @@ import { Notifications } from '../models/reply.model' import { Rating } from '../models/ratings' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { IntegerType, ObjectId } from 'mongodb' import { checkUserLoggedIn } from '../helpers/user.helpers' import { Context } from './../context' @@ -12,12 +12,12 @@ import { Profile } from '../models/profile.model' const replyResolver = { Query: { async getReplies(_: any, args: any, context: Context) { - ;(await checkUserLoggedIn(context))(['coordinator', 'trainee']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR, 'trainee']) const replies = await Notifications.find({}) return replies }, async getRepliesByUser(_: any, args: any, context: Context) { - ;(await checkUserLoggedIn(context))(['coordinator', 'trainee']) + ;(await checkUserLoggedIn(context))([RoleOfUser.COORDINATOR, 'trainee']) const SpecificReplies = await Notifications.find({ user: args.userId }) return SpecificReplies }, diff --git a/src/resolvers/resolver.ts b/src/resolvers/resolver.ts index e03906e9..8cf6cdb9 100644 --- a/src/resolvers/resolver.ts +++ b/src/resolvers/resolver.ts @@ -3,6 +3,7 @@ import * as jwt from 'jsonwebtoken'; import mongoose from 'mongoose'; import { User } from '../models/user'; import { Profile } from '../models/profile.model'; +import { emailExpression, generateToken } from '../helpers/user.helpers'; const SECRET = process.env.SECRET || 'test_secret' @@ -40,8 +41,6 @@ const resolvers = { ) { const userExists = await User.findOne({ email: email }) if (userExists) throw new Error('Email is taken') - const emailExpression = - /^(([^<>()\\[\]\\.,;:\s@“]+(\.[^<>()\\[\]\\.,;:\s@“]+)*)|(“.+“))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ const isValidEmail = emailExpression.test(String(email).toLowerCase()) if (!isValidEmail) throw new Error('invalid email format') if (password.length < 6) @@ -52,13 +51,7 @@ const resolvers = { email: email, password: hashedPassword, }) - const token = jwt.sign( - { userId: newUser._id, role: newUser?.role }, - SECRET, - { - expiresIn: '2h', - } - ) + const token = generateToken(newUser._id.toString(), newUser?.role) return { token, user: newUser } }, diff --git a/src/resolvers/team.resolvers.ts b/src/resolvers/team.resolvers.ts index 98ba87d9..6ed3e58d 100644 --- a/src/resolvers/team.resolvers.ts +++ b/src/resolvers/team.resolvers.ts @@ -5,7 +5,7 @@ import Team from '../models/team.model' import Program from '../models/program.model' import Phase from '../models/phase.model' import Cohort from '../models/cohort.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' import { Context } from '../context' import { ProgramType } from './program.resolvers' @@ -52,15 +52,15 @@ const resolvers = { try { // some validations const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) // get the organization if a superAdmin logs in let org - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { org = await checkLoggedInOrganization(orgToken) } @@ -72,12 +72,12 @@ const resolvers = { await Team.find({ organization: org }) .populate({ path: 'cohort', - match: role === 'manager' && managerMatch, + match: role === RoleOfUser.MANAGER && managerMatch, model: Cohort, strictPopulate: false, populate: { path: 'organization', - match: role === 'admin' && adminMatch, + match: role === RoleOfUser.ADMIN && adminMatch, model: Organization, strictPopulate: false, populate: { @@ -98,7 +98,7 @@ const resolvers = { strictPopulate: false, }) .populate({ - path: 'manager', + path: RoleOfUser.MANAGER, model: User, strictPopulate: false, }) @@ -127,15 +127,15 @@ const resolvers = { try { // some validations const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'coordinator', - 'manager', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.COORDINATOR, + RoleOfUser.MANAGER, ]) // get the organization if a superAdmin logs in let org - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { org = await checkLoggedInOrganization(orgToken) } @@ -145,12 +145,12 @@ const resolvers = { return ( await Team.find({ organization: org }).populate({ path: 'cohort', - match: role === 'manager' && managerMatch, + match: role === RoleOfUser.MANAGER && managerMatch, model: Cohort, strictPopulate: false, populate: { path: 'organization', - match: role === 'admin' && adminMatch, + match: role === RoleOfUser.ADMIN && adminMatch, model: Organization, strictPopulate: false, }, @@ -178,10 +178,10 @@ const resolvers = { try { // coordinator validation const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'admin', - 'manager', - 'coordinator', - 'ttl', + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, + RoleOfUser.TTL, ]) // get the organization if someone logs in @@ -209,14 +209,14 @@ const resolvers = { ], }) ).filter((user: any) => { - if (role === 'admin') { + if (role === RoleOfUser.ADMIN) { return ( user.team?.name == team && user.team?.cohort?.program?.organization.name == org?.name && user.team?.cohort?.program?.organization.admin.includes(userId) ) } - if (role === 'manager') { + if (role === RoleOfUser.MANAGER) { return ( user.team.name == team && user.team?.cohort?.program?.organization.name == org?.name && @@ -226,7 +226,7 @@ const resolvers = { ) == userId ) } - if (role === 'coordinator') { + if (role === RoleOfUser.COORDINATOR) { return ( user.team.name == team && user.team?.cohort?.program?.organization.name == org?.name && @@ -271,7 +271,7 @@ const resolvers = { const { name, cohortName, orgToken, startingPhase, ttlEmail } = args // some validations - ;(await checkUserLoggedIn(context))(['superAdmin', 'admin', 'manager']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN, RoleOfUser.MANAGER]) const cohort = await Cohort.findOne({ name: cohortName }) const organ = await checkLoggedInOrganization(orgToken) @@ -345,7 +345,7 @@ const resolvers = { } }, deleteTeam: async (parent: any, args: any, context: Context) => { - ;(await checkUserLoggedIn(context))(['admin', 'manager']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.MANAGER]) const findTeam = await Team.findById(args.id) if (!findTeam) throw new Error('The Team you want to delete does not exist') @@ -379,10 +379,10 @@ const resolvers = { context: Context ) => { const { userId, role }: any = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, ]) const team: any = await Team.findById(id) @@ -409,7 +409,7 @@ const resolvers = { strictPopulate: false, }) .populate({ - path: 'manager', + path: RoleOfUser.MANAGER, model: User, strictPopulate: false, }) @@ -447,7 +447,7 @@ const resolvers = { }) } - if (role !== 'superAdmin') { + if (role !== RoleOfUser.SUPER_ADMIN) { const org = await checkLoggedInOrganization(orgToken) if (cohortOrg.id.toString() !== org.id.toString()) { @@ -460,7 +460,7 @@ const resolvers = { } ) } - if (role === 'admin' && !cohortOrg.admin.includes(userId)) { + if (role === RoleOfUser.ADMIN && !cohortOrg.admin.includes(userId)) { throw new GraphQLError( `Team with id "${id}" doesn't exist in your organization`, { @@ -471,7 +471,7 @@ const resolvers = { ) } if ( - role === 'manager' && + role === RoleOfUser.MANAGER && cohortProgram?.manager?.toString() !== userId?.toString() ) { throw new GraphQLError( @@ -484,7 +484,7 @@ const resolvers = { ) } if ( - role === 'coordinator' && + role === RoleOfUser.COORDINATOR && team?.cohort?.coordinator.toString() !== userId?.toString() ) { throw new GraphQLError('You are not assigned to this Team!', { @@ -585,7 +585,7 @@ const resolvers = { strictPopulate: false, }) .populate({ - path: 'manager', + path: RoleOfUser.MANAGER, model: User, strictPopulate: false, }) diff --git a/src/resolvers/ticket.resolver.ts b/src/resolvers/ticket.resolver.ts index 6c6f4b33..7c379447 100644 --- a/src/resolvers/ticket.resolver.ts +++ b/src/resolvers/ticket.resolver.ts @@ -2,7 +2,7 @@ import { GraphQLError } from 'graphql' import Ticket from '../models/ticket.model' import { Context } from '../context' import { checkUserLoggedIn } from '../helpers/user.helpers' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { PubSub } from 'graphql-subscriptions' import { pushNotification } from '../utils/notification/pushNotification' @@ -23,12 +23,12 @@ async function createReply( replyMessage: string ) { try { - const isSuperAdmin = context?.role === 'superAdmin' + const isSuperAdmin = context?.role === RoleOfUser.SUPER_ADMIN const reply: any = { sender: context?.userId, receiver: isSuperAdmin ? user?._id.toString() - : (await User.findOne({ role: 'superAdmin' }))?._id.toString(), + : (await User.findOne({ role: RoleOfUser.SUPER_ADMIN }))?._id.toString(), replyMessage, } @@ -84,22 +84,22 @@ const resolvers = { await ( await checkUserLoggedIn(context) )([ - 'superAdmin', - 'admin', - 'manager', - 'coordinator', - 'trainee', - 'ttl', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, + RoleOfUser.MANAGER, + RoleOfUser.COORDINATOR, + RoleOfUser.TRAINEE, + RoleOfUser.TTL, 'users', ]) // Allow admins to fetch all tickets const filterObj: any = (() => { - if (['superAdmin', 'admin'].includes(context.role)) { + if ([RoleOfUser.SUPER_ADMIN, RoleOfUser.ADMIN].includes(context.role)) { return {} // Admins can see all tickets } else if (context.role === 'trainee') { return { $or: [{ assignee: context.userId }] } - } else if (context.role === 'coordinator') { + } else if (context.role === RoleOfUser.COORDINATOR) { return { $or: [{ user: context.userId }] } } return { user: context.userId } // Regular users see their own tickets @@ -141,7 +141,7 @@ const resolvers = { try { await ( await checkUserLoggedIn(context) - )(['admin', 'superAdmin', 'coordinator', 'ttl']) + )([RoleOfUser.ADMIN, RoleOfUser.SUPER_ADMIN, RoleOfUser.COORDINATOR, RoleOfUser.TTL]) const { subject, message, assignee }: any = args let assigneeUser = null @@ -178,7 +178,7 @@ const resolvers = { }) const receiverId: any = - assignee || (await User.findOne({ role: 'superAdmin' }))?._id + assignee || (await User.findOne({ role: RoleOfUser.SUPER_ADMIN }))?._id const senderId: any = context.userId await pushNotification( receiverId, @@ -216,8 +216,8 @@ const resolvers = { const { user }: any = ticket if ( - context.role !== 'superAdmin' && - context.role !== 'admin' && + context.role !== RoleOfUser.SUPER_ADMIN && + context.role !== RoleOfUser.ADMIN && user?.toString() !== context.userId ) { throw new GraphQLError('Access denied!', { @@ -253,7 +253,7 @@ const resolvers = { try { await ( await checkUserLoggedIn(context) - )(['admin', 'coordinator', 'manager', 'trainee']) + )([RoleOfUser.ADMIN, RoleOfUser.COORDINATOR, RoleOfUser.MANAGER, RoleOfUser.TRAINEE]) const ticket: any = await Ticket.findById(ticketId) if (!ticket) @@ -263,7 +263,7 @@ const resolvers = { if ( context.userId !== ticket.user.toString() && - context.role !== 'superAdmin' + context.role !== RoleOfUser.SUPER_ADMIN ) { throw new GraphQLError('Access denied!', { extensions: { code: 'VALIDATION_ERROR' }, @@ -296,7 +296,7 @@ const resolvers = { try { await ( await checkUserLoggedIn(context) - )(['admin', 'coordinator', 'superAdmin', 'ttl']) + )([RoleOfUser.ADMIN, RoleOfUser.COORDINATOR, RoleOfUser.SUPER_ADMIN, RoleOfUser.TTL]) const ticket = await Ticket.findById(updateTicketId) if (!ticket) @@ -306,8 +306,8 @@ const resolvers = { // Allow admins to update any ticket if ( - context.role !== 'superAdmin' && - context.role !== 'admin' && + context.role !== RoleOfUser.SUPER_ADMIN && + context.role !== RoleOfUser.ADMIN && context.userId !== ticket.user.toString() ) { throw new GraphQLError('Access denied!', { @@ -330,7 +330,7 @@ const resolvers = { try { await ( await checkUserLoggedIn(context) - )(['admin', 'coordinator', 'superAdmin', 'ttl']) + )([RoleOfUser.ADMIN, RoleOfUser.COORDINATOR, RoleOfUser.SUPER_ADMIN, RoleOfUser.TTL]) const ticket = await Ticket.findById(id) if (!ticket) @@ -340,8 +340,8 @@ const resolvers = { // Allow admins to delete any ticket if ( - context.role !== 'superAdmin' && - context.role !== 'admin' && + context.role !== RoleOfUser.SUPER_ADMIN && + context.role !== RoleOfUser.ADMIN && context.userId !== ticket.user.toString() ) { throw new GraphQLError('Access denied!', { diff --git a/src/resolvers/userResolver.ts b/src/resolvers/userResolver.ts index 89d40637..8c268373 100644 --- a/src/resolvers/userResolver.ts +++ b/src/resolvers/userResolver.ts @@ -1,14 +1,14 @@ /* eslint-disable prefer-const */ import { GraphQLError } from 'graphql' -import * as jwt from 'jsonwebtoken' +// import * as jwt from 'jsonwebtoken' import { JwtPayload, verify } from 'jsonwebtoken' import mongoose, { Error } from 'mongoose' import generateRandomPassword from '../helpers/generateRandomPassword' -import { checkUserLoggedIn } from '../helpers/user.helpers' +import { checkUserLoggedIn, emailExpression, generateToken, generateTokenOrganization, generateTokenUserExists } from '../helpers/user.helpers' import { checkLoggedInOrganization } from '../helpers/organization.helper' import Cohort from '../models/cohort.model' import Program from '../models/program.model' -import { User, UserRole } from '../models/user' +import { RoleOfUser, User, UserRole } from '../models/user' import { Organization } from '../models/organization.model' import { Profile } from '../models/profile.model' import { sendEmail } from '../utils/sendEmail' @@ -43,7 +43,7 @@ enum Status { const resolvers: any = { Query: { async getOrganizations(_: any, __: any, context: Context) { - ;(await checkUserLoggedIn(context))(['superAdmin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN]) return Organization.find() }, @@ -63,8 +63,8 @@ const resolvers: any = { }, async getOrganization(_: any, { name }: any, context: Context) { const { userId, role } = (await checkUserLoggedIn(context))([ - 'superAdmin', - 'admin', + RoleOfUser.SUPER_ADMIN, + RoleOfUser.ADMIN, 'trainee', ]) @@ -98,10 +98,10 @@ const resolvers: any = { context: Context ) { ;(await checkUserLoggedIn(context))([ - 'admin', - 'coordinator', + RoleOfUser.ADMIN, + RoleOfUser.COORDINATOR, 'trainee', - 'manager', + RoleOfUser.MANAGER, 'ttl', ]) @@ -216,8 +216,6 @@ const resolvers: any = { }, }) - const emailExpression = - /^(([^<>()\[\]\\.,;:\s@“]+(\.[^<>()\[\]\\.,;:\s@“]+)*)|(“.+“))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ const isValidEmail = emailExpression.test(String(email).toLowerCase()) if (!isValidEmail) throw new GraphQLError('invalid email format', { @@ -246,9 +244,7 @@ const resolvers: any = { password, organizations: org.name, }) - const token = jwt.sign({ userId: user._id, role: user?.role }, SECRET, { - expiresIn: '2h', - }) + const token = generateToken(user._id.toString(), user?.role) if (user && invitation) { invitation.status = 'accepted' @@ -333,7 +329,7 @@ const resolvers: any = { { $push: { activity: { $each: [newActivity] } } } ) if ( - user?.role === 'trainee' && + user?.role === RoleOfUser.TRAINEE && user?.organizations?.includes(org?.name) ) { if ( @@ -345,11 +341,7 @@ const resolvers: any = { throw new Error('Please wait to be added to a program or cohort') } if (await isAssigned(org?.name, user._id)) { - const token = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { expiresIn: '2h' } - ) + const token = generateToken(user._id, user._doc?.role || 'user') const data = { token: token, user: user.toJSON(), @@ -361,19 +353,13 @@ const resolvers: any = { ) } } else if ( - user?.role === 'ttl' && + user?.role === RoleOfUser.TTL && user?.organizations?.includes(org?.name) ) { if (user.cohort && user.team) { - const token = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { - expiresIn: '2h', - } - ) + const token = generateToken(user._id, user._doc?.role || 'user') const data = { - token: token, + token: token, user: user.toJSON(), } return data @@ -386,20 +372,14 @@ const resolvers: any = { admin: user.id, }) - if (user?.role === 'admin' && organization) { - const token = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { - expiresIn: '2h', - } - ) + if (user?.role === RoleOfUser.ADMIN && organization) { + const token = generateToken(user._id, user._doc?.role || 'user') const data = { token: token, user: user.toJSON(), } return data - } else if (user?.role === 'manager') { + } else if (user?.role === RoleOfUser.MANAGER) { const program: any = await Program.find({ manager: user.id, }).populate({ @@ -415,12 +395,9 @@ const resolvers: any = { } } if (checkProgramOrganization) { - const managerToken = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { - expiresIn: '2h', - } + const managerToken = generateToken( + user._id, + user._doc?.role || 'user' ) const managerData = { token: managerToken, @@ -430,7 +407,7 @@ const resolvers: any = { } else { throw new Error('You are not assigned to any program yet.') } - } else if (user?.role === 'coordinator') { + } else if (user?.role === RoleOfUser.COORDINATOR) { const cohort: any = await Cohort.find({ coordinator: user.id, }).populate({ @@ -452,12 +429,9 @@ const resolvers: any = { } if (checkCohortOrganization) { - const coordinatorToken = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { - expiresIn: '2h', - } + const coordinatorToken = generateToken( + user._id, + user._doc?.role || 'user' ) const coordinatorData = { token: coordinatorToken, @@ -467,13 +441,10 @@ const resolvers: any = { } else { throw new Error('You are not assigned to any cohort yet.') } - } else if (user?.role === 'superAdmin') { - const superAdminToken = jwt.sign( - { userId: user._id, role: user._doc?.role || 'user' }, - SECRET, - { - expiresIn: '2h', - } + } else if (user?.role === RoleOfUser.SUPER_ADMIN) { + const superAdminToken = generateToken( + user._id, + user._doc?.role || 'user' ) const superAdminData = { token: superAdminToken, @@ -509,14 +480,14 @@ const resolvers: any = { if (!requester) { throw new Error('Requester does not exist') } - if (requester.role !== 'admin' && requester.role !== 'superAdmin') { + if (requester.role !== RoleOfUser.ADMIN && requester.role !== RoleOfUser.SUPER_ADMIN) { throw new Error('You do not have permission to delete users') } const userToDelete = await User.findById(input.id) if (!userToDelete) { throw new Error('User to be deleted does not exist') } - if (userToDelete.role === 'coordinator') { + if (userToDelete.role === RoleOfUser.COORDINATOR) { const hasCohort = await Cohort.findOne({ coordinator: input.id }) if (hasCohort) { await Cohort.findOneAndReplace( @@ -547,12 +518,12 @@ const resolvers: any = { async updateUserRole(_: any, { id, name, orgToken }: any) { const allRoles = [ - 'trainee', - 'coordinator', - 'manager', - 'admin', - 'superAdmin', - 'ttl', + RoleOfUser.TRAINEE, + RoleOfUser.COORDINATOR, + RoleOfUser.MANAGER, + RoleOfUser.ADMIN, + RoleOfUser.SUPER_ADMIN, + RoleOfUser.TTL, ] const org = await checkLoggedInOrganization(orgToken) const roleExists = allRoles.includes(name) @@ -561,7 +532,7 @@ const resolvers: any = { if (!userExists) throw new Error("User doesn't exist") const getAllUsers = await User.find({ - role: 'admin', + role:RoleOfUser.ADMIN, }) let checkUserOrganization = 0 @@ -572,11 +543,11 @@ const resolvers: any = { } }) - if (checkUserOrganization == 1 && userExists.role == 'admin') { + if (checkUserOrganization == 1 && userExists.role == RoleOfUser.ADMIN) { throw new Error('There must be at least one admin in the organization') } - if (userExists.role == 'coordinator') { + if (userExists.role == RoleOfUser.COORDINATOR) { const userCohort: any = await Cohort.find({ coordinator: userExists?.id, }) @@ -590,7 +561,7 @@ const resolvers: any = { } ) } - } else if (userExists.role == 'manager') { + } else if (userExists.role == RoleOfUser.MANAGER) { const userProgram: any = await Program.find({ manager: userExists?.id }) if (userProgram) { await Program.updateMany( @@ -614,7 +585,7 @@ const resolvers: any = { } ) } - } else if (userExists.role == 'admin') { + } else if (userExists.role == RoleOfUser.ADMIN) { const userOrg: any = await Organization.find({ admin: userExists?.id }) if (userOrg) { await Organization.findByIdAndUpdate(userOrg.id, { @@ -624,7 +595,7 @@ const resolvers: any = { }) } } - if (name == 'admin') { + if (name == RoleOfUser.ADMIN) { org?.admin?.push(id) org.save() } @@ -667,9 +638,7 @@ const resolvers: any = { } if (organization) { - const token = jwt.sign({ name: organization.name }, SECRET, { - expiresIn: '336h', - }) + const token = generateTokenOrganization(organization.name) const data = { token: token, organization: organization.toJSON(), @@ -717,9 +686,9 @@ const resolvers: any = { const existingUser = await User.findOne({ email, - role: { $ne: 'admin' }, + role: { $ne: RoleOfUser.ADMIN }, }) - const admin = await User.findOne({ email, role: 'admin' }) + const admin = await User.findOne({ email, role: RoleOfUser.ADMIN }) if (existingUser) { throw new GraphQLError( `User with email '${email}' exists and is not an admin. Please use another email.`, @@ -746,7 +715,7 @@ const resolvers: any = { newAdmin = await User.create({ email: email, password: password, - role: 'admin', + role: RoleOfUser.ADMIN, organizations: name, }) @@ -758,7 +727,7 @@ const resolvers: any = { status: 'pending', }) - const superAdmin = await User.find({ role: 'superAdmin' }) + const superAdmin = await User.find({ role: RoleOfUser.SUPER_ADMIN }) // Get the email content const content = registrationRequest(email, name, description) const link = process.env.FRONTEND_LINK @@ -786,7 +755,7 @@ const resolvers: any = { context: Context ) { // check if requester is super admin - ;(await checkUserLoggedIn(context))(['superAdmin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN]) const orgExists = await Organization.findOne({ name: name }) if (action == 'approve') { if (!orgExists) { @@ -856,7 +825,7 @@ const resolvers: any = { context: Context ) { // the below commented line help to know if the user is an superAdmin to perform an action of creating an organization - ;(await checkUserLoggedIn(context))(['superAdmin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.SUPER_ADMIN]) if (action == 'new') { const orgExists = await Organization.findOne({ name: name }) if (orgExists) { @@ -869,7 +838,7 @@ const resolvers: any = { } // check if the requester is already an admin, if not create him - const admin = await User.findOne({ email, role: 'admin' }) + const admin = await User.findOne({ email, role: RoleOfUser.ADMIN }) // if (!admin) { // console.log('admin exist') // } @@ -879,7 +848,7 @@ const resolvers: any = { newAdmin = await User.create({ email, password, - role: 'admin', + role: RoleOfUser.ADMIN, }) } @@ -921,7 +890,7 @@ const resolvers: any = { { name, gitHubOrganisation }: any, context: Context ) { - ;(await checkUserLoggedIn(context))(['admin', 'superAdmin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.SUPER_ADMIN]) const org = await Organization.findOne({ name: name }) if (!org) { @@ -976,7 +945,7 @@ const resolvers: any = { }, async deleteActiveRepostoOrganization(_: any, { name, repoUrl }: any) { - // const { userId } = (await checkUserLoggedIn(context))(['admin','superAdmin']); + // const { userId } = (await checkUserLoggedIn(context))([RoleOfUser.ADMIN,RoleOfUser.SUPER_ADMIN]); const org = await Organization.findOne({ name: name }) if (!org) { @@ -1011,7 +980,7 @@ const resolvers: any = { }, async deleteOrganization(_: any, { id }: any, context: Context) { - ;(await checkUserLoggedIn(context))(['admin', 'superAdmin']) + ;(await checkUserLoggedIn(context))([RoleOfUser.ADMIN, RoleOfUser.SUPER_ADMIN]) const organizationExists = await Organization.findOne({ _id: id }) @@ -1022,7 +991,7 @@ const resolvers: any = { await Phase.deleteMany({ organization: id }) await User.deleteMany({ organizations: organizationExists.name, - role: { $ne: 'superAdmin' }, + role: { $ne: RoleOfUser.SUPER_ADMIN }, }) await User.deleteOne({ _id: organizationExists.admin[0] }) const deleteOrg = await Organization.findOneAndDelete({ @@ -1040,9 +1009,7 @@ const resolvers: any = { const userExists: any = await User.findOne({ email }) if (userExists) { - const token: any = jwt.sign({ email }, SECRET, { - expiresIn: '2d', - }) + const token: any = generateTokenUserExists(email) const newToken: any = token.replaceAll('.', '*') const deepLink = `${process.env.FRONTEND_LINK}/redirect/?path=/auth/reset-password&token=${newToken}` const link = `${process.env.FRONTEND_LINK}/forgot-password/${newToken}` diff --git a/src/seeders/attendance.seed.ts b/src/seeders/attendance.seed.ts index 87a1943e..a77125fb 100644 --- a/src/seeders/attendance.seed.ts +++ b/src/seeders/attendance.seed.ts @@ -1,12 +1,12 @@ /* eslint-disable */ -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Attendance } from '../models/attendance.model' const seedAttendance = async () => { const traineeLimit = 25 const coordinators = await User.find({ - role: 'coordinator', + role: RoleOfUser.COORDINATOR, organizations: { $in: ['Andela'] }, }) diff --git a/src/seeders/cohorts.seed.ts b/src/seeders/cohorts.seed.ts index fef19bfd..5d04cb5b 100644 --- a/src/seeders/cohorts.seed.ts +++ b/src/seeders/cohorts.seed.ts @@ -1,7 +1,7 @@ import Cohort from '../models/cohort.model' import Phase from '../models/phase.model' import Program from '../models/program.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' const seedCohorts = async () => { @@ -25,11 +25,11 @@ const seedCohorts = async () => { // Coordinators const andelCoord = await User.find({ - role: 'coordinator', + role: RoleOfUser.COORDINATOR, organizations: { $in: ['Andela'] }, }) const iremboCoord = await User.find({ - role: 'coordinator', + role: RoleOfUser.COORDINATOR, organizations: { $in: ['Irembo'] }, }) diff --git a/src/seeders/organization.seed.ts b/src/seeders/organization.seed.ts index 8abaf0e6..6796112d 100644 --- a/src/seeders/organization.seed.ts +++ b/src/seeders/organization.seed.ts @@ -1,15 +1,15 @@ /* eslint-disable */ -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' const seedOrganizations = async () => { const andelaAdmins = await User.find({ - role: 'admin', + role: RoleOfUser.ADMIN, organizations: { $in: ['Andela'] }, }) const IremboAdmins = await User.find({ - role: 'admin', + role: RoleOfUser.ADMIN, organizations: { $in: ['Irembo'] }, }) diff --git a/src/seeders/programs.seed.ts b/src/seeders/programs.seed.ts index 461ced7c..35202ba0 100644 --- a/src/seeders/programs.seed.ts +++ b/src/seeders/programs.seed.ts @@ -1,15 +1,15 @@ import Program from '../models/program.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Organization } from '../models/organization.model' const seedPrograms = async () => { const andelaManagers = await User.find({ - role: 'manager', + role: RoleOfUser.MANAGER, organizations: { $in: ['Andela'] }, }) const IremboManagers = await User.find({ - role: 'manager', + role: RoleOfUser.MANAGER, organizations: { $in: ['Irembo'] }, }) diff --git a/src/seeders/ticket.seed.ts b/src/seeders/ticket.seed.ts index 9bc9df2d..92c84948 100644 --- a/src/seeders/ticket.seed.ts +++ b/src/seeders/ticket.seed.ts @@ -1,5 +1,5 @@ import Ticket from '../models/ticket.model' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' const generateSubject = (userId: string): string => { const subjects = [ @@ -35,7 +35,7 @@ const seedTickets = async (): Promise => { throw new Error('No assignees found with the role "user".') } const user = await User.findOne({ - role: { $in: ['admin', 'coordinator'] }, + role: { $in: [RoleOfUser.ADMIN, RoleOfUser.COORDINATOR] }, }).select('_id') if (!user) { throw new Error('No user found with the role "admin" or "coordinator".') diff --git a/src/seeders/userRoles.seed.ts b/src/seeders/userRoles.seed.ts index 91ea6e69..0fe639ad 100644 --- a/src/seeders/userRoles.seed.ts +++ b/src/seeders/userRoles.seed.ts @@ -1,25 +1,25 @@ import mongoose from 'mongoose' -import { UserRole } from '../models/user' +import { RoleOfUser, UserRole } from '../models/user' // Create seed data for user roles with explicit IDs const userRolesSeed = [ { - name: 'superAdmin', + name: RoleOfUser.SUPER_ADMIN, }, { - name: 'admin', + name: RoleOfUser.ADMIN, }, { - name: 'coordinator', + name: RoleOfUser.COORDINATOR, }, { - name: 'ttl', + name: RoleOfUser.TTL, }, { - name: 'manager', + name: RoleOfUser.MANAGER, }, { - name: 'trainee', + name: RoleOfUser.TRAINEE, }, ] diff --git a/src/seeders/users.seed.ts b/src/seeders/users.seed.ts index 2b0f8856..5b75b78c 100644 --- a/src/seeders/users.seed.ts +++ b/src/seeders/users.seed.ts @@ -1,5 +1,5 @@ import { hashSync } from 'bcryptjs' -import { User } from '../models/user' +import { RoleOfUser, User } from '../models/user' import { Profile } from '../models/profile.model' const organizations: any = { @@ -101,14 +101,14 @@ const seedUsers = async () => { if ( registerUsers.filter( (user) => - user.organizations.includes(orgName) && user.role === 'admin' + user.organizations.includes(orgName) && user.role === RoleOfUser.ADMIN ).length === usersTypes.admin ) break registerUsers.push({ email: element.email, password: hashSync('Test@12345'), - role: 'admin', + role: RoleOfUser.ADMIN, organizations: [orgName], }) } @@ -118,14 +118,14 @@ const seedUsers = async () => { if ( registerUsers.filter( (user) => - user.organizations.includes(orgName) && user.role === 'manager' + user.organizations.includes(orgName) && user.role === RoleOfUser.MANAGER ).length === usersTypes.manager ) break registerUsers.push({ email: element.email, password: hashSync('Test@12345'), - role: 'manager', + role: RoleOfUser.MANAGER, organizations: [orgName], }) } @@ -137,14 +137,14 @@ const seedUsers = async () => { registerUsers.filter( (user) => user.organizations.includes(orgName) && - user.role === 'coordinator' + user.role === RoleOfUser.COORDINATOR ).length === usersTypes.coordinators ) break registerUsers.push({ email: element.email, password: hashSync('Test@12345'), - role: 'coordinator', + role: RoleOfUser.COORDINATOR, organizations: [orgName], }) } @@ -190,7 +190,7 @@ const seedUsers = async () => { registerUsers.unshift({ email: 'samuel.nishimwe@andela.com', password: hashSync('Test@12345'), - role: 'superAdmin', + role: RoleOfUser.SUPER_ADMIN, organizations: ['Andela'], }) diff --git a/src/utils/extractFileData.ts b/src/utils/extractFileData.ts index 9e1e8ec5..04ef199f 100644 --- a/src/utils/extractFileData.ts +++ b/src/utils/extractFileData.ts @@ -1,10 +1,11 @@ import { ReadStream } from 'fs' import { GraphQLError } from 'graphql' import * as xlsx from 'xlsx' +import { RoleOfUser } from '../models/user' const EmailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ -type Role = 'trainee' | 'admin' | 'ttl' | 'coordinator' +type Role = RoleOfUser.TRAINEE | RoleOfUser.ADMIN | RoleOfUser.TTL | RoleOfUser.COORDINATOR export async function extractFileData(file: any) { try { @@ -30,7 +31,7 @@ export async function extractFileData(file: any) { const email = (row as { email?: string }).email?.trim() const role = (row as { role?: string }).role?.trim().toLowerCase() - const validRoles: Role[] = ['trainee', 'admin', 'ttl', 'coordinator'] + const validRoles: Role[] = [RoleOfUser.TRAINEE, RoleOfUser.ADMIN, RoleOfUser.TTL, RoleOfUser.COORDINATOR] if ( email && EmailPattern.test(email) &&