diff --git a/Dockerfile b/Dockerfile index 9dfbc518..a7efab94 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,9 +14,14 @@ RUN npm install # (assuming your app is in the "src" directory of your project) COPY . . +# Copy the init-db.sh script to the working directory +COPY init-db.sh /app/src/init-db.sh + +# Make the init-db.sh script executable +RUN chmod +x /app/src/init-db.sh # Make port 8080 available to the world outside this container EXPOSE 8080 # Run the app when the container launches -CMD [ "npm", "start" ] +CMD [ "sh", "init-db.sh"] diff --git a/README.md b/README.md index 65464732..a26b97c3 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,16 @@ We welcome contributions to make ScholarX even better! Feel free to send us a pu ## Prerequisites -Before you can start using this project, make sure you have the following installed on your machine: +Before you can start using this project, make sure you have the following installed on your local machine: - Node.js (version 18 or later) - npm (version 9 or later) +- PostgreSQL (version 15 or later) ## Getting Started +### **Project setup walkthrough :- https://youtu.be/1STopJMM2nM** + Follow these steps to get started with the ScholarX backend: 1. Clone this repository to your local machine: @@ -39,13 +42,13 @@ Follow these steps to get started with the ScholarX backend: npm install ``` -3. Copy the `.env` file: +3. Copy `.env.example` file as `.env`: ```bash - cp .env.example .env + cp .env.example .env #For Linux and macos ``` -4. Replace the environment variables in the newly created `.env` file with your configuration. +4. Replace the environment variables in the newly created `.env` file with your configurations. 5. Start the server: @@ -61,115 +64,28 @@ Follow these steps to get started with the ScholarX backend: 7. Open your web browser and navigate to `http://localhost:${server_port}` to access the running server. -## Docker Setup - -If you prefer to use Docker for development, follow these steps: - -1. Ensure Docker and Docker Compose are installed on your machine. You can download them from here https://www.docker.com/products/docker-desktop/. - -2. Build the Docker images: - -`docker-compose build` - -3. Start the Docker containers: - -`docker-compose up` - -4. The application and its services are now running in Docker containers. You can access the application at `http://localhost:${SERVER_PORT}`, where `SERVER_PORT` is the port number specified in your `.env` file. - -5. To stop the Docker containers, use the following commnd: - -`docker-compose down` - -Please note that the Docker Compose setup assumes that you have a `.env` file in your project root. You can create one by copying the `.env.example` file: - -`cp .env.example .env` - -Then, replace the environment variables in the newly created `.env` file with your configuration. - -The environment directive sets environment variables inside the Docker container. These variables are used to configure the PostgreSQL server. The values for `${DB_USER}`, `${DB_PASSWORD}`, and `${DB_NAME}` should be specified in your .env file. - -Remember to replace `${SERVER_PORT}` with the actual port number if it's a fixed value. If it's specified in the `.env` file, you can leave it as is. - -In the `docker-compose.yml` file, we also have a `db` service for the PostgreSQL database: +Docker Setup (optional) +------------------------------------- -```dockercompose -db: - image: postgres:15 - ports: - - "5432:5432" - environment: - - POSTGRES_USER=${DB_USER} - - POSTGRES_PASSWORD=${DB_PASSWORD} - - POSTGRES_DB=${DB_NAME} -``` - -This service uses the official postgres:15 Docker image. The ports directive maps port 5432 inside the Docker container to port 5432 on your host machine, allowing you to connect to the PostgreSQL server at `localhost:5432`. - -Now, you can connect to the PostgreSQL server running inside the Docker container using a database client. Use `localhost:5432` as the server address, and the `${DB_USER}`, `${DB_PASSWORD}`, and `${DB_NAME}` values from your `.env` file for the username, password, and database name, respectively. - -### Note +Alternatively you can use Docker to run ScholarX. Follow these setps: -If you have a local PostgreSQL server running on port 5432, you will need to stop it before starting the Docker container, or change the port mapping to avoid a conflict. +1. Ensure you have Docker and Docker Compose installed on you machine. -Remember to replace `${SERVER_PORT}` with the actual port number if it's a fixed value. If it's specified in the `.env` file, you can leave it as is. - ---- - -#### Code Quality - -We strive to maintain a high code quality. You can check for linting issues by running: +2. Build and run the Docker containers. ```bash -npm run lint +docker compose up --build ``` +3. The application will be available at `http://localhost:${server_port}`. -And to automatically format the code, use: +4. To stop the containers, run: ```bash -npm run format +docker compose down ``` -## Project Structure - -Here's an overview of the project structure: - -``` -scholarx-backend/ -├── src/ -│ ├── controllers/ -│ │ └── index.ts -│ ├── middleware/ -│ │ └── index.ts -│ ├── routes/ -│ │ └── index.ts -│ ├── services/ -│ │ └── auth.service.ts -│ ├── entities/ -│ │ └── profile.entity.ts -│ ├── index.ts -│ └── types.ts -├── .env.example -├── .gitignore -├── package.json -├── tsconfig.json -└── README.md -``` - -- `src/controllers/`: Contains the controller classes that handle incoming requests. -- `src/middleware/`: Contains the middleware functions used to modify requests and responses. -- `src/routes/`: Contains the route definitions for the application. -- `src/services/`: Contains the service definitions for the application. -- `src/entities/`: Contains the entity models for the application. -- `src/index.ts`: Creates and configures the Express application and starts the server. -- `src/types.ts`: Defines custom types for the application. -- `.env.example`: An example configuration file for environment variables. -- `.gitignore`: A list of files and directories to be ignored by Git. -- `package.json`: Contains information about the project and its dependencies. -- `tsconfig.json`: Configuration file for the TypeScript compiler. - -Database Configuration and Migration ------------------------------------- +Database Configuration and Migrations +------------------------------------- ### Setting up the Database @@ -180,8 +96,6 @@ Database Configuration and Migration ```bash CREATE DATABASE scholarx; ``` - - 3. Update your `.env` file with your database configuration: ```bash @@ -191,48 +105,21 @@ Database Configuration and Migration DB_PASSWORD=your_db_password DB_NAME=scholarx ``` +4. Synchronize the database schema: -### Running Migrations and Seeding the Database - -#### Migration Commands - -1. **Generate a new migration**: - - ```bash - npm run migration:generate -- -n MigrationName - ``` - - This command generates a new migration file with the specified name. - -2. **Run migrations**: - - - ```bash - npm run migration:run - ``` - - This command runs all pending migrations. - -3. **Synchronize the database schema**: - - - ```bash npm run sync:db ``` + This command synchronizes your database schema with the current state of the entities on your project. - This command synchronizes your database schema with the current state of your entities. - -4. **Seed the database**: +4. Seed the database - ```bash npm run seed ``` - This command builds the project and runs the database seeding script located in `dist/src/scripts/seed-db.js`. -### Example Migration and Seeding Commands +### Example Migration Commands - To generate a new migration named `AddUserTable`: @@ -248,18 +135,15 @@ Database Configuration and Migration npm run migration:run ``` -- To synchronize the database schema: - - ```bash - npm run sync:db - ``` +## Setting up SMTP -- To seed the database: +To enable Email functionality in this project, follow these steps: - - ```bash - npm run seed - ``` +1. Go to your Google Account. (Make sure to enable 2-step verification) +2. Go to App Passwords section. +3. Provide the app name as "scholarx" and click create. +4. Copy the given password and paste it without spaces for SMTP_PASSWORD property in .env file. +5. Enter your email for SMTP_EMAIL property in .env file. ## Setting up Google Authentication @@ -367,10 +251,40 @@ We appreciate your interest in ScholarX. Happy contributing! If you have any que 8. Verify it from your account. -## Create dummy data +## Project Structure -1. Run the seeding script: +Here's an overview of the project structure: - ```bash - npm run seed - ``` +``` +scholarx-backend/ +├── src/ +│ ├── controllers/ +│ │ └── index.ts +│ ├── middleware/ +│ │ └── index.ts +│ ├── routes/ +│ │ └── index.ts +│ ├── services/ +│ │ └── auth.service.ts +│ ├── entities/ +│ │ └── profile.entity.ts +│ ├── index.ts +│ └── types.ts +├── .env.example +├── .gitignore +├── package.json +├── tsconfig.json +└── README.md +``` + +- `src/controllers/`: Contains the controller classes that handle incoming requests. +- `src/middleware/`: Contains the middleware functions used to modify requests and responses. +- `src/routes/`: Contains the route definitions for the application. +- `src/services/`: Contains the service definitions for the application. +- `src/entities/`: Contains the entity models for the application. +- `src/index.ts`: Creates and configures the Express application and starts the server. +- `src/types.ts`: Defines custom types for the application. +- `.env.example`: An example configuration file for environment variables. +- `.gitignore`: A list of files and directories to be ignored by Git. +- `package.json`: Contains information about the project and its dependencies. +- `tsconfig.json`: Configuration file for the TypeScript compiler. diff --git a/docker-compose.yml b/docker-compose.yml index 2ea7951d..affdc0de 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,16 +7,28 @@ services: depends_on: - db environment: - - DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} + - DB_HOST=db + - DB_PORT=5432 + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + - DB_NAME=${DB_NAME} - JWT_SECRET=${JWT_SECRET} + - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} + - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} + - GOOGLE_REDIRECT_URL=${GOOGLE_REDIRECT_URL} + - LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID} + - LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET} + - LINKEDIN_REDIRECT_URL=${LINKEDIN_REDIRECT_URL} + - CLIENT_URL=${CLIENT_URL} + - IMG_HOST=${IMG_HOST} + - SMTP_MAIL=${SMTP_MAIL} + - SMTP_PASSWORD=${SMTP_PASSWORD} + command: ["sh", "/app/src/init-db.sh"] db: - image: postgres:15 ports: - "5432:5432" - environment: - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} - - POSTGRES_DB=${DB_NAME} - + - POSTGRES_DB=${DB_NAME} \ No newline at end of file diff --git a/init-db.sh b/init-db.sh new file mode 100755 index 00000000..a7034587 --- /dev/null +++ b/init-db.sh @@ -0,0 +1,15 @@ +# This is a script to initialize the database for the first time when the container is started. +# It will wait for the database to be ready before running the migrations. +# Wait for the + +echo "Database is ready. Running migrations..." + +# Run the migrations +npm run sync:db +npm run seed + +echo "Migrations complete. Database is ready." + +# Start the application + +npm run dev diff --git a/package.json b/package.json index 92dfade8..db302f94 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "migration:run": "npm run typeorm:db -- migration:run", "migration:revert": "npm run typeorm:db -- migration:revert", "sync:db": "npm run typeorm:db schema:sync", - "seed": "npm run build && node dist/src/scripts/seed-db.js" + "seed": "npx ts-node src/scripts/seed-db.ts" }, "author": "", "license": "ISC", diff --git a/src/configs/envConfig.ts b/src/configs/envConfig.ts index 451eebde..6aa77950 100644 --- a/src/configs/envConfig.ts +++ b/src/configs/envConfig.ts @@ -15,7 +15,7 @@ export const GOOGLE_REDIRECT_URL = process.env.GOOGLE_REDIRECT_URL ?? '' export const CLIENT_URL = process.env.CLIENT_URL ?? '' export const IMG_HOST = process.env.IMG_HOST ?? '' export const SMTP_MAIL = process.env.SMTP_MAIL ?? '' -export const SMTP_PASS = process.env.SMTP_PASS ?? '' +export const SMTP_PASSWORD = process.env.SMTP_PASSWORD ?? '' export const LINKEDIN_CLIENT_ID = process.env.LINKEDIN_CLIENT_ID ?? '' export const LINKEDIN_CLIENT_SECRET = process.env.LINKEDIN_CLIENT_SECRET ?? '' export const LINKEDIN_REDIRECT_URL = process.env.LINKEDIN_REDIRECT_URL ?? '' diff --git a/src/controllers/monthlyChecking.controller.ts b/src/controllers/monthlyChecking.controller.ts index bb6ed6ef..02b8c5e2 100644 --- a/src/controllers/monthlyChecking.controller.ts +++ b/src/controllers/monthlyChecking.controller.ts @@ -15,7 +15,7 @@ export const postMonthlyCheckIn = async ( try { const { menteeId, - title, + month, generalUpdatesAndFeedback, progressTowardsGoals, mediaContentLinks @@ -23,7 +23,7 @@ export const postMonthlyCheckIn = async ( const newCheckIn = await addMonthlyCheckInByMentee( menteeId, - title, + month, generalUpdatesAndFeedback, progressTowardsGoals, mediaContentLinks diff --git a/src/controllers/profile.controller.ts b/src/controllers/profile.controller.ts index 001df3aa..637d6b12 100644 --- a/src/controllers/profile.controller.ts +++ b/src/controllers/profile.controller.ts @@ -93,7 +93,7 @@ export const deleteProfileHandler = async ( console.error('Error executing query', err) return res .status(500) - .json({ error: 'Internal server errorrrr', message: err.message }) + .json({ error: 'Internal server error', message: err.message }) } throw err diff --git a/src/entities/checkin.entity.ts b/src/entities/checkin.entity.ts index 31693ad9..9de056f6 100644 --- a/src/entities/checkin.entity.ts +++ b/src/entities/checkin.entity.ts @@ -5,7 +5,7 @@ import Mentee from './mentee.entity' @Entity('monthly-check-in') class MonthlyCheckIn extends BaseEntity { @Column({ type: 'text' }) - title: string + month: string @Column({ type: 'text' }) generalUpdatesAndFeedback: string @@ -13,7 +13,7 @@ class MonthlyCheckIn extends BaseEntity { @Column({ type: 'text' }) progressTowardsGoals: string - @Column({ type: 'json' }) + @Column({ type: 'json', nullable: true }) mediaContentLinks: string[] @Column({ type: 'text', nullable: true }) @@ -33,7 +33,7 @@ class MonthlyCheckIn extends BaseEntity { mentee: Mentee constructor( - title: string, + month: string, generalUpdatesAndFeedback: string, progressTowardsGoals: string, mediaContentLinks: string[], @@ -44,7 +44,7 @@ class MonthlyCheckIn extends BaseEntity { mentee: Mentee ) { super() - this.title = title + this.month = month this.generalUpdatesAndFeedback = generalUpdatesAndFeedback this.progressTowardsGoals = progressTowardsGoals this.mediaContentLinks = mediaContentLinks diff --git a/src/migrations/1720590807560-profile-lastName-nullable.ts b/src/migrations/1720590807560-profile-lastName-nullable.ts index 4906ce34..9702ca68 100644 --- a/src/migrations/1720590807560-profile-lastName-nullable.ts +++ b/src/migrations/1720590807560-profile-lastName-nullable.ts @@ -1,14 +1,19 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; +import { type MigrationInterface, type QueryRunner } from 'typeorm' -export class ProfileLastNameNullable1720590807560 implements MigrationInterface { - name = 'ProfileLastNameNullable1720590807560' +export class ProfileLastNameNullable1720590807560 + implements MigrationInterface +{ + name = 'ProfileLastNameNullable1720590807560' - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "profile" ALTER COLUMN "last_name" DROP NOT NULL`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "profile" ALTER COLUMN "last_name" SET NOT NULL`); - } + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "profile" ALTER COLUMN "last_name" DROP NOT NULL` + ) + } + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "profile" ALTER COLUMN "last_name" SET NOT NULL` + ) + } } diff --git a/src/migrations/1726849469636-CreateCountryTable.ts b/src/migrations/1726849469636-CreateCountryTable.ts index 060875c3..0f8e29eb 100644 --- a/src/migrations/1726849469636-CreateCountryTable.ts +++ b/src/migrations/1726849469636-CreateCountryTable.ts @@ -1,15 +1,33 @@ -import { MigrationInterface, QueryRunner } from 'typeorm' +import { type MigrationInterface, type QueryRunner } from 'typeorm' export class CreateCountryTable1726849469636 implements MigrationInterface { name = 'CreateCountryTable1726849469636' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query( - `CREATE TABLE "country" ("uuid" uuid NOT NULL DEFAULT uuid_generate_v4(), "created_at" TIMESTAMP NOT NULL DEFAULT now(), "updated_at" TIMESTAMP NOT NULL DEFAULT now(), "code" character varying NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_4e06beff3ecfb1a974312fe536d" PRIMARY KEY ("uuid"))` - ) + await queryRunner.query(` + CREATE TABLE IF NOT EXISTS "country" ( + "uuid" uuid NOT NULL DEFAULT uuid_generate_v4(), + "created_at" TIMESTAMP NOT NULL DEFAULT now(), + "updated_at" TIMESTAMP NOT NULL DEFAULT now(), + "code" character varying NOT NULL, + "name" character varying NOT NULL, + CONSTRAINT "PK_4e06beff3ecfb1a974312fe536d" PRIMARY KEY ("uuid") + ) + `) + + const columnExists = await queryRunner.query(` + SELECT column_name + FROM information_schema.columns + WHERE table_name='mentor' AND column_name='countryUuid' + `) + + if (columnExists.length === 0) { + await queryRunner.query(`ALTER TABLE "mentor" ADD "countryUuid" uuid`) + } } public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "mentor" DROP COLUMN "countryUuid"`) await queryRunner.query(`DROP TABLE "country"`) } } diff --git a/src/migrations/1726930041488-UpdateMentorTableWithCountry.ts b/src/migrations/1726930041488-UpdateMentorTableWithCountry.ts index 5000549d..487fc0ba 100644 --- a/src/migrations/1726930041488-UpdateMentorTableWithCountry.ts +++ b/src/migrations/1726930041488-UpdateMentorTableWithCountry.ts @@ -1,4 +1,4 @@ -import { MigrationInterface, QueryRunner } from 'typeorm' +import { type MigrationInterface, type QueryRunner } from 'typeorm' export class UpdateMentorTableWithCountry1726930041488 implements MigrationInterface diff --git a/src/migrations/1727197270336-monthly-checking-tags.ts b/src/migrations/1733854881851-monthly-checking-rename.ts similarity index 62% rename from src/migrations/1727197270336-monthly-checking-tags.ts rename to src/migrations/1733854881851-monthly-checking-rename.ts index 2a1009e3..a9417dd4 100644 --- a/src/migrations/1727197270336-monthly-checking-tags.ts +++ b/src/migrations/1733854881851-monthly-checking-rename.ts @@ -1,14 +1,14 @@ import { MigrationInterface, QueryRunner } from "typeorm"; -export class MonthlyCheckingTags1727197270336 implements MigrationInterface { - name = 'MonthlyCheckingTags1727197270336' +export class MonthlyCheckingRename1733854881851 implements MigrationInterface { + name = 'MonthlyCheckingRename1733854881851' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "monthly-check-in" ADD "tags" json`); + await queryRunner.query(`ALTER TABLE "monthly-check-in" RENAME COLUMN "title" TO "month"`); } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "monthly-check-in" DROP COLUMN "tags"`); + await queryRunner.query(`ALTER TABLE "monthly-check-in" RENAME COLUMN "month" TO "title"`); } } diff --git a/src/schemas/mentee-routes.schemas.ts b/src/schemas/mentee-routes.schemas.ts index 4069319f..435df405 100644 --- a/src/schemas/mentee-routes.schemas.ts +++ b/src/schemas/mentee-routes.schemas.ts @@ -12,7 +12,7 @@ export const updateMenteeStatusSchema = z.object({ export const postMonthlyCheckInSchema = z.object({ menteeId: z.string(), - title: z.enum([ + month: z.enum([ 'January', 'February', 'March', @@ -32,9 +32,7 @@ export const postMonthlyCheckInSchema = z.object({ progressTowardsGoals: z .string() .min(1, 'Please provide a valid progress report'), - mediaContentLinks: z - .array(z.string()) - .min(1, 'Please provide at least 1 media content links') + mediaContentLinks: z.array(z.string()).optional() }) export const addFeedbackMonthlyCheckInSchema = z.object({ diff --git a/src/services/admin/email.service.ts b/src/services/admin/email.service.ts index 8bf5cca1..36c5fa93 100644 --- a/src/services/admin/email.service.ts +++ b/src/services/admin/email.service.ts @@ -2,7 +2,7 @@ import { dataSource } from '../../configs/dbConfig' import { EmailStatusTypes } from '../../enums' import nodemailer from 'nodemailer' import Email from '../../entities/email.entity' -import { SMTP_MAIL, SMTP_PASS } from '../../configs/envConfig' +import { SMTP_MAIL, SMTP_PASSWORD } from '../../configs/envConfig' import { loadTemplate } from '../../utils' const transporter = nodemailer.createTransport({ @@ -11,7 +11,7 @@ const transporter = nodemailer.createTransport({ secure: false, auth: { user: SMTP_MAIL, - pass: SMTP_PASS + pass: SMTP_PASSWORD } }) diff --git a/src/services/monthlyChecking.service.ts b/src/services/monthlyChecking.service.ts index 6fe1fc8e..0ed38471 100644 --- a/src/services/monthlyChecking.service.ts +++ b/src/services/monthlyChecking.service.ts @@ -47,7 +47,7 @@ export const addFeedbackByMentor = async ( export const addMonthlyCheckInByMentee = async ( menteeId: string, - title: string, + month: string, generalUpdatesAndFeedback: string, progressTowardsGoals: string, mediaContentLinks: string[] @@ -70,10 +70,10 @@ export const addMonthlyCheckInByMentee = async ( } const newCheckIn = checkInRepository.create({ - title, + month, generalUpdatesAndFeedback, progressTowardsGoals, - mediaContentLinks, + mediaContentLinks: mediaContentLinks || null, checkInDate: new Date(), mentee }) @@ -111,14 +111,6 @@ export const fetchMonthlyCheckIns = async ( order: { checkInDate: 'DESC' } }) - if (checkIns.length === 0 || !checkIns) { - return { - statusCode: 404, - checkIns: [], - message: 'No check-ins found' - } - } - return { statusCode: 200, checkIns, diff --git a/src/templates/emailTemplate.ejs b/src/templates/emailTemplate.ejs index ee6969f4..65ed3929 100644 --- a/src/templates/emailTemplate.ejs +++ b/src/templates/emailTemplate.ejs @@ -132,9 +132,8 @@

<%- message %>

To ensure that you receive our emails and they do not go - to your spam folder, please add - sustainableedufoundation@gmail.com to your email - whitelist. + to your spam folder, please add admin@sefglobal.org to + your email whitelist.

Please join our slack channel diff --git a/src/types.ts b/src/types.ts index 8c39f185..a6e3bbfb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -37,7 +37,7 @@ export interface LinkedInProfile { export interface MonthlyCheckInResponse { uuid: string - title: string + month: string generalUpdatesAndFeedback: string progressTowardsGoals: string mediaContentLinks: string[] diff --git a/src/utils.ts b/src/utils.ts index cb90429d..f35208b9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -147,7 +147,7 @@ export const getEmailContent = async ( subject: 'Thank you very much for applying to ScholarX', message: `Dear ${name},

Thank you very much for applying to ScholarX. Your application has been received. Our team will soon review your application, and we will keep you posted on the progress via email. - Please reach out to us via sustainableedufoundation@gmail.com for any clarifications.` + Please reach out to us via admin@sefglobal.org for any clarifications.` } case MentorApplicationStatus.APPROVED: return { @@ -190,7 +190,7 @@ export const getEmailContent = async ( return { subject: 'Thank you very much for applying to ScholarX', message: `Dear ${name},

- Thank you very much for applying to ScholarX. Your application has been received. Mentor will soon review your application and we will keep you posted on the progress via email. Until then, read more about student experience here and reach out to us via sustainableedufoundation@gmail.com for any clarifications. ` + Thank you very much for applying to ScholarX. Your application has been received. Mentor will soon review your application and we will keep you posted on the progress via email. Until then, read more about student experience here and reach out to us via admin@sefglobal.org for any clarifications. ` } case MenteeApplicationStatus.APPROVED: return { @@ -281,7 +281,7 @@ export const getMentorNotifyEmailContent = ( subject: 'New Mentee Application Received', message: `Dear ${name},

We wanted to let you know that a new mentee has applied to be mentored by you through the ScholarX program. Please visit your dashboard to review their application at your earliest convenience.

- If you have any questions or need assistance, feel free to reach out to us at sustainableedufoundation@gmail.com. + If you have any questions or need assistance, feel free to reach out to us at admin@sefglobal.org.

Thank you for your continued support and commitment to the ScholarX program.

`