Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ node_modules
**.pem
.vscode
.terraform
*.tfvars
*.tfvars
2 changes: 1 addition & 1 deletion auth-service/db/connect.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import mongoose from "mongoose"
import { InternalServerError } from "#shared/errors/errors.js";
import { SecretService } from "#shared/utils/index.js"

const secret = await SecretService.getSecret("prod/cr-user-sv");
const secret = await SecretService.getSecret(process.env.SERVICE_SECRET_NAME);

const MONGO_USERNAME = secret.MONGO_USERNAME || process.env.MONGO_USERNAME;
const MONGO_PASSWORD = secret.MONGO_PASSWORD || process.env.MONGO_PASSWORD;
Expand Down
13 changes: 0 additions & 13 deletions auth-service/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion auth-service/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
"@aws-sdk/client-secrets-manager": "^3.908.0",
"bcrypt": "^6.0.0",
"cookie-parser": "^1.4.7",
"dotenv": "^17.2.1",
"express": "^5.1.0",
"fs": "^0.0.1-security",
"ioredis": "^5.7.0",
Expand Down
2 changes: 1 addition & 1 deletion auth-service/utils/jwt.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import jwt from "jsonwebtoken"
import fs from 'fs'
import { SecretService } from "#shared/utils/index.js"

const secret = await SecretService.getSecret("prod/cr-user-sv");
const secret = await SecretService.getSecret(process.env.SERVICE_SECRET_NAME);

export default class JwtFacade {
static ACCESS_TOKEN_SECRET = secret.PRIVATE_KEY || fs.readFileSync("private.pem", "utf8");
Expand Down
63 changes: 37 additions & 26 deletions class-service/api/studentServiceApi.js
Original file line number Diff line number Diff line change
@@ -1,45 +1,56 @@
import axios from "axios";
import { InternalServerError } from "#shared/errors/errors.js";
import { LambdaInvoker } from "../utils/index.js";

const URL = process.env.STUDENT_SERVICE_URL;
const STUDENT_SERVICE = process.env.STUDENT_SERVICE_API; // Development: localhost URL, Production: Lambda function name

class StudentServiceClient {
constructor(baseURL) {
this.api = axios.create({ baseURL });
}
constructor() {
this.isProd = process.env.NODE_ENV === "production";

async getStudentByIds(ids, accessToken) {
try {
const res = await this.api.get(`/by-ids?ids=${ids}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
} catch (err) {
throw new InternalServerError(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
if (!this.isProd) {
this.api = axios.create({ baseURL: STUDENT_SERVICE });
} else {
this.lambda = new LambdaInvoker();
}
}

async getStudentById(id, accessToken) {
async getStudentByIds(ids, accessToken) {
const route = `/by-ids?ids=${ids}`;
try {
const res = await this.api.get(`/${id}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
if (!this.isProd) {
const res = await this.api.get(route, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
}
return await this.lambda.invoke("GET", route, accessToken, STUDENT_SERVICE);
} catch (err) {
throw new InternalServerError(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
if (!this.isProd) {
logger.error(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
} else {
logger.error("StudentService error:", err);
}
}
}

async deleteStudentById(id, accessToken) {
async getStudentById(id, accessToken) {
const route = `/${id}`;
try {
const res = await this.api.delete(`/${id}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
if (!this.isProd) {
const res = await this.api.get(route, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
}
return await this.lambda.invoke("GET", route, accessToken, STUDENT_SERVICE);
} catch (err) {
throw new InternalServerError(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
if (!this.isProd) {
logger.error(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
} else {
logger.error("StudentService error:", err);
}
}
}
}

export default new StudentServiceClient(URL);
export default new StudentServiceClient();
34 changes: 24 additions & 10 deletions class-service/api/teacherServiceApi.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
import axios from "axios";
import { InternalServerError } from "#shared/errors/errors.js";
import { LambdaInvoker } from "../utils/index.js";

const URL = process.env.TEACHER_SERVICE_URL;
const TEACHER_SERVICE = process.env.TEACHER_SERVICE_API; // Development: localhost URL, Production: Lambda function name

class TeacherServiceClient {
constructor(baseURL) {
this.api = axios.create({ baseURL });
constructor() {
this.isProd = process.env.NODE_ENV === "production";

if (!this.isProd) {
this.api = axios.create({ baseURL: TEACHER_SERVICE });
} else {
this.lambda = new LambdaInvoker();
}
}

async getTeacherById(id, accessToken) {
const route = `/${id}`;
try {
const res = await this.api.get(`/${id}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
if (!this.isProd) {
const res = await this.api.get(route, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
}
return await this.lambda.invoke("GET", route, accessToken, TEACHER_SERVICE);
} catch (err) {
throw new InternalServerError(`Teacher API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
if (!this.isProd) {
logger.error(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
} else {
logger.error("StudentService error:", err);
}
}
}
}

export default new TeacherServiceClient(URL);
export default new TeacherServiceClient();
34 changes: 24 additions & 10 deletions class-service/api/userServiceApi.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
import axios from "axios";
import { InternalServerError } from "#shared/errors/errors.js";
import { LambdaInvoker } from "../utils/index.js";

const URL = process.env.USER_SERVICE_URL;
const USER_SERVICE = process.env.USER_SERVICE_API; // Development: localhost URL, Production: Lambda function name

class UserServiceClient {
constructor(baseURL) {
this.api = axios.create({ baseURL });
constructor() {
this.isProd = process.env.NODE_ENV === "production";

if (!this.isProd) {
this.api = axios.create({ baseURL: USER_SERVICE });
} else {
this.lambda = new LambdaInvoker();
}
}

async getUserByIds(ids, accessToken) {
const route = `/by-ids?ids=${ids}`;
try {
const res = await this.api.get(`/by-ids?ids=${ids}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
if (!this.isProd) {
const res = await this.api.get(route, {
headers: { Authorization: `Bearer ${accessToken}` },
});
return res.data;
}
return await this.lambda.invoke("GET", route, accessToken, USER_SERVICE);
} catch (err) {
throw new InternalServerError(`Auth API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
if (!this.isProd) {
logger.error(`Student API returned ${err.response.status}: ${err.response.data?.msg || err.message}`);
} else {
logger.error("StudentService error:", err);
}
}
}
}

export default new UserServiceClient(URL);
export default new UserServiceClient();
Loading