Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ft schedule technical interview #158

Closed
wants to merge 7 commits into from
7 changes: 3 additions & 4 deletions src/helpers/bulkyMails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,12 @@ export const sendUserCredentials = async (email: String, password: String) => {
}
};


export const sendEmailTemplate = async (
email: string,
subject: string,
title: string,
body: string,
button?: { url: string, text: string }
button?: { url: string; text: string }
) => {
try {
const logoText = "DevPulse";
Expand Down Expand Up @@ -171,7 +170,7 @@ export const sendEmailTemplate = async (
<div style="margin-top: 80px;">
<p style="color: #555; font-size: 14px;">
If you received this email by mistake, simply ignore it. <br />
For any questions, contact us at <a href="mailto: samuel.nishimwe@andela.com" style="color: ${secondaryColor};">[email protected]</a>.
For any questions, contact us at <a href="mailto: devpulsedev@gmail.com" style="color: ${secondaryColor};">[email protected]</a>.
</p>
<a href="" style="margin: 0 10px; display: inline-flex; align-items: center; text-decoration: none;">
<img
Expand Down Expand Up @@ -252,7 +251,7 @@ export const sendEmailTemplate = async (
${generateLogo(logoText, mainColor)}
${generateTitle(title)}
${generateBody(body)}
${button ? generateButton(button.url, button.text) : ''}
${button ? generateButton(button.url, button.text) : ""}
${generateFooterLogo()}
${generateSocialIcons()}
${generateFooter()}
Expand Down
52 changes: 31 additions & 21 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ApolloServer } from "apollo-server";
import { mergeResolvers, mergeTypeDefs } from "@graphql-tools/merge";
import { connect } from "./database/db.config";
import './utils/cronJob';
import "./utils/cronJob";
import { typeDefsTrainee } from "./schema/traineeApplicantSchema";
import { typeDefsAttribute } from "./schema/traineeAttributeSchema";
import { traineeApplicantResolver } from "./resolvers/traineeApplicantResolver";
Expand Down Expand Up @@ -30,7 +30,7 @@ import { LoggedUserSchema } from "./schema/loggedUser";
import { loggedUserResolvers } from "./resolvers/loginUserResolver";
import sendBulkyEmailResolver from "./resolvers/bulkyEmailResolver";
import sendBulkyEmailTypeDefs from "./schema/bulkyEmailTypeDefs";
import {roleSchema} from "./schema/roleTypedefs";
import { roleSchema } from "./schema/roleTypedefs";
import { roleResolvers } from "./resolvers/roleResolver";
import { permissionResolvers } from "./resolvers/permissionResolver";
import { permissionSchemaTypeDef } from "./schema/permissionTypeSchema";
Expand All @@ -40,39 +40,44 @@ import { formSchema } from "./schema/formSchema";
import { formsResolver } from "./resolvers/forms.resolver";
import { formatError } from "./utils/customErrorHandler";
import { formJobSchema } from "./schema/formJobSchema";
import { jobPostResolver } from "./resolvers/jobPostResolvers"
import { jobPostResolver } from "./resolvers/jobPostResolvers";
import { programTypeDefs } from "./schema/programSchema";
import { programResolvers } from "./resolvers/programResolver";
import { cohortSchema } from "./schema/cohortScheme";
import { cohortResolver } from "./resolvers/cohortResolver";
import { viewOwnApplicationTypeDefs } from "./schema/viewOwnApplication";
import { viewOwnApplicationTypeDefs } from "./schema/viewOwnApplication";
import candidateViewOwnApplication from "./resolvers/viewOwnApplicationResolver";
import { gradingTypeDefs } from "./schema/gradingSchema";
import gradingResolver from "./resolvers/grading";
import {adminViewApplicationsResolvers }from "./resolvers/adminViewApplications";
import { adminViewAllApplicationsTypedefs} from "./schema/adminViewApplicationsSchema";
import { adminViewApplicationsResolvers } from "./resolvers/adminViewApplications";
import { adminViewAllApplicationsTypedefs } from "./schema/adminViewApplicationsSchema";
import { attendanceResolver } from "./resolvers/attendanceResolver";
import { attendanceSchema } from "./schema/attendanceSchema";
import { performanceResolver } from "./resolvers/performanceResolver";
import { performanceSchema } from "./schema/performanceSchema";
import { applicationStageDefs } from './schema/applicationStage';
import { applicationStageResolvers } from './resolvers/applicationStageResolver';
import {
applicationStageDefs,
technicalInterviewDefs,
} from "./schema/applicationStage";
import { applicationStageResolvers } from "./resolvers/applicationStageResolver";
import filterJobResolver from "./resolvers/filterJob";
import filterProgramResolver from "./resolvers/filterPrograms";
import filterRoleResolver from "./resolvers/filterRole";
import applicantNotificationResolver from "./resolvers/applicantNotifications"
import applicantNotifcationsTypedefs from "./schema/applicantNotifications"
import applicantNotificationResolver from "./resolvers/applicantNotifications";
import applicantNotifcationsTypedefs from "./schema/applicantNotifications";
// import {forgetPassword } from "./resolvers/forgetpassword";
import { passwordResolvers } from './resolvers/forgetpassword';
import { passwordResolvers } from "./resolvers/forgetpassword";
import { passwordSchema } from "./schema/forgetpassword";
import { SearchSchema } from "./schema/searchSchema";
import { searchResolver } from "./resolvers/searchResolver";
import {appliedJobResolver} from "./resolvers/appliedJobResolver";
import { appliedJobResolver } from "./resolvers/appliedJobResolver";
import { appliedJobTypeDefs } from "./schema/appliedJobTypeDefs";
import { adminNotificationsResolver } from "./resolvers/adminNotificationsResolver";
import { adminNotificationsSchema } from "./schema/adminNotificationsSchema";import { ticketResolver } from "./resolvers/ticketResolver";
import { adminNotificationsSchema } from "./schema/adminNotificationsSchema";
import { ticketResolver } from "./resolvers/ticketResolver";
import { ticketSchema } from "./schema/ticketSchema";
import filterTicketResolver from "./resolvers/filterTicketResolver";
import { technicalInterviewResolvers } from "./resolvers/scheduleInterviewResolver";

const PORT = process.env.PORT || 3000;

Expand Down Expand Up @@ -110,10 +115,12 @@ const resolvers = mergeResolvers([
passwordResolvers,
searchResolver,
appliedJobResolver,
applicationStageResolvers,
adminNotificationsResolver,
ticketResolver,
filterTicketResolver,
applicationStageResolvers
applicationStageResolvers,
technicalInterviewResolvers,
]);
const typeDefs = mergeTypeDefs([
applicationCycleTypeDefs,
Expand Down Expand Up @@ -146,9 +153,11 @@ const typeDefs = mergeTypeDefs([
appliedJobTypeDefs,
performanceSchema,
attendanceSchema,
applicationStageDefs,
adminNotificationsSchema,
ticketSchema,
applicationStageDefs
applicationStageDefs,
technicalInterviewDefs,
]);

const server = new ApolloServer({
Expand All @@ -159,11 +168,12 @@ const server = new ApolloServer({
let authToken = null;
let currentUser = null;
try {
authToken = req.headers.authorization && req.headers.authorization.startsWith("Bearer ")
? req.headers.authorization.split(" ")[1]
: req.headers.authorization;
authToken =
req.headers.authorization &&
req.headers.authorization.startsWith("Bearer ")
? req.headers.authorization.split(" ")[1]
: req.headers.authorization;
if (authToken) {

currentUser = await findOrCreateUser(authToken);
}
} catch (error) {
Expand All @@ -178,5 +188,5 @@ const server = new ApolloServer({

connect().then(() => {
console.log("Database connected!");
server.listen(PORT).then(({ url }) => console.info(`App on ${url}`));
});
server.listen(PORT).then(({ url }) => console.info(`App on ${url}`));
});
12 changes: 5 additions & 7 deletions src/models/AuthUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ const userSchema = new Schema(
type: String,
default: process.env.DEFAULT_AVATAR,
},
isVerified:{
type:Boolean,
default:false
isVerified: {
type: Boolean,
default: false,
},
role: {
type: Schema.Types.ObjectId,
Expand Down Expand Up @@ -45,17 +45,15 @@ const userSchema = new Schema(
isEmailVerified: {
type: Boolean,
default: false,

},
cohort: {
type: Schema.Types.ObjectId,
ref: "cohortModel",
},
resetToken: String,
resetTokenExpiration:Date

resetTokenExpiration: Date,
},
{ timestamps: true }
);

export const LoggedUserModel = model("LoggedUserModel", userSchema);
export const LoggedUserModel = model("LoggedUserModel", userSchema);
12 changes: 9 additions & 3 deletions src/models/InterviewAssessmentStageSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,36 @@ import mongoose, { Schema, Document } from "mongoose";

interface IInterviewAssessment extends Document {
applicantId: mongoose.Schema.Types.ObjectId;
status: "No action" | "Moved" | "Dismissed";
status: "No action" | "Moved" | "Rejected" | "Admitted";
interviewScore: number;
comments?: string;
}

const interviewAssessmentSchema = new Schema<IInterviewAssessment>({
applicantId: {
type: Schema.Types.ObjectId,
ref: "Applicant",
ref: "Trainees",
required: true,
},
status: {
type: String,
enum: ["No action", "Moved", "Dismissed"],
enum: ["No action", "Moved", "Rejected", "Admitted"],
default: "No action",
},
interviewScore: {
type: Number,
min: 0,
max: 2,
validate: {
validator: (value : number) => value === null || (value >= 0 && value <= 2),
message: "Score must be between 0 and 2."
}
},
comments: {
type: String,
},
},{
timestamps: true
});

const InterviewAssessment = mongoose.model<IInterviewAssessment>(
Expand Down
9 changes: 6 additions & 3 deletions src/models/ShortlistedSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,27 @@ import mongoose, { Schema, Document } from "mongoose";

interface IShortlisted extends Document {
applicantId: mongoose.Schema.Types.ObjectId;
status: "No action" | "Moved" | "Dismissed";
status: "No action" | "Moved" | "Rejected" | "Admitted";
comments?: string;
}

const shortlistedSchema = new Schema<IShortlisted>({
applicantId: {
type: Schema.Types.ObjectId,
ref: "Applicant",
ref: "Trainees",
required: true,

},
status: {
type: String,
enum: ["No action", "Moved", "Dismissed"],
enum: ["No action", "Moved", "Rejected", "Admitted"],
default: "No action",
},
comments: {
type: String,
},
},{
timestamps: true,
});

const Shortlisted = mongoose.model<IShortlisted>("Shortlisted", shortlistedSchema);
Expand Down
4 changes: 3 additions & 1 deletion src/models/admittedStageSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ interface IAdmitted extends Document {
const admittedSchema = new Schema<IAdmitted>({
applicantId: {
type: Schema.Types.ObjectId,
ref: "Applicant",
ref: "Trainees",
required: true,
},
status: {
Expand All @@ -20,6 +20,8 @@ const admittedSchema = new Schema<IAdmitted>({
comments: {
type: String,
},
},{
timestamps: true
});

const Admitted = mongoose.model<IAdmitted>("Admitted", admittedSchema);
Expand Down
16 changes: 12 additions & 4 deletions src/models/dismissedStageSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ interface IDismissed extends Document {
applicantId: mongoose.Schema.Types.ObjectId;
stageDismissedFrom: string;
comments?: string;
status: "Rejected"; // Added status field
}

const dismissedSchema = new Schema<IDismissed>({
const rejectedSchema = new Schema<IDismissed>({
applicantId: {
type: Schema.Types.ObjectId,
ref: "Applicant",
ref: "Trainees",
required: true,
},
stageDismissedFrom: {
Expand All @@ -19,7 +20,14 @@ const dismissedSchema = new Schema<IDismissed>({
comments: {
type: String,
},
status:{
type: String,
default: "Rejected",
required: true,
}
},{
timestamps: true
});

const Dismissed = mongoose.model<IDismissed>("Dismissed", dismissedSchema);
export default Dismissed;
const Rejected = mongoose.model<IDismissed>("Rejected", rejectedSchema);
export default Rejected;
7 changes: 5 additions & 2 deletions src/models/stageSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import mongoose, { Schema, Document } from "mongoose";

interface IStageTracking extends Document {
applicantId: mongoose.Schema.Types.ObjectId;
currentStage: "Shortlisted" | "Technical Assessment" | "Interview Assessment" | "Admitted" | "Dismissed";
currentStage: "Applied" | "Shortlisted" | "Technical Assessment" | "Interview Assessment" | "Admitted" | "Rejected";
history: [
{
stage: string;
comments: string;
enteredAt: Date;
exitedAt?: Date;
}
Expand All @@ -20,12 +21,14 @@ const stageTrackingSchema = new Schema<IStageTracking>({
},
currentStage: {
type: String,
enum: ["Shortlisted", "Technical Assessment", "Interview Assessment", "Admitted", "Dismissed"],
enum: ["Applied","Shortlisted", "Technical Assessment", "Interview Assessment", "Admitted", "Rejected"],
required: true,
default: "Applied",
},
history: [
{
stage: { type: String, required: true },
comments:{type:String,required: true},
enteredAt: { type: Date, default: Date.now },
exitedAt: { type: Date },
}
Expand Down
9 changes: 6 additions & 3 deletions src/models/technicalAssessmentStage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,33 @@ import mongoose, { Schema, Document } from "mongoose";

interface ITechnicalAssessment extends Document {
applicantId: mongoose.Schema.Types.ObjectId;
status: "No action" | "Moved" | "Dismissed";
status: "No action" | "Moved" | "Rejected" | "Admitted";
score: number;
comments?: string;
}

const technicalAssessmentSchema = new Schema<ITechnicalAssessment>({
applicantId: {
type: Schema.Types.ObjectId,
ref: "Applicant",
ref: "Trainees",
required: true,
},
status: {
type: String,
enum: ["No action", "Moved", "Dismissed"],
enum: ["No action", "Moved", "Rejected", "Admitted"],
default: "No action",
},
score: {
type: Number,
min: 0,
max: 100,
default:null
},
comments: {
type: String,
},
},{
timestamps: true
});

const TechnicalAssessment = mongoose.model<ITechnicalAssessment>(
Expand Down
Loading