Skip to content

Commit

Permalink
##update: thuanvv update new api-2
Browse files Browse the repository at this point in the history
  • Loading branch information
vuvanthuan committed Jan 19, 2025
1 parent 0649a28 commit 4f40289
Show file tree
Hide file tree
Showing 15 changed files with 164 additions and 36 deletions.
3 changes: 2 additions & 1 deletion prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@ model users {

model activity_class {
id Int @id @default(autoincrement()) @db.UnsignedInt
class_id Int?
name String? @db.VarChar(500)
image_url String? @db.VarChar(500)
status Int
Expand All @@ -443,7 +444,7 @@ model customer_reviews {

model student_results {
id Int @id @default(autoincrement()) @db.UnsignedInt
class_name String? @db.VarChar(45)
class_id Int?
name String? @db.VarChar(500)
description String? @db.VarChar(500)
result_image String @db.VarChar(500)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import { ActivityClassDTO } from "@domain/dtos/activity-class";
import { ActivityClassEntity } from "@domain/entities";

export function map(activityClass: ActivityClassEntity): ActivityClassDTO {
export function map(activityClass: ActivityClassDTO): ActivityClassDTO {
return {
id: activityClass.id ?? null,
name: activityClass.name ?? null,
class: {
id: String(activityClass?.class?.id),
name: activityClass?.class?.name ?? null,
description: activityClass?.class?.description ?? null,
image: activityClass?.class?.image ?? null,
},
name: activityClass?.name ?? null,
image_url: activityClass.image_url ?? null,
status: activityClass.status,
order: activityClass.order ?? null,
created_at: activityClass.created_at?.toISOString() ?? null,
updated_at: activityClass.updated_at?.toISOString() ?? null,
created_at: activityClass.created_at ?? null,
updated_at: activityClass.updated_at ?? null,
created_by: activityClass.created_by ?? null,
updated_by: activityClass.updated_by ?? null,
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,51 @@
import { ActivityClassDTO } from "@domain/dtos/activity-class";
import { map } from "./list-activity-class-query-mapper";

export function makeListActivityClassQuery({ activityClassRepository }: Pick<Dependencies, 'activityClassRepository'>) {
return async function listActivityClassQuery() {
export type ListActivitClassQuery = Readonly<{
language: string;
}>;

const activityClasses = await activityClassRepository.list();
export function makeListActivityClassQuery({ activityClassRepository, db }: Pick<Dependencies, 'activityClassRepository' | 'db'>) {
return async function listActivityClassQuery({ language }: ListActivitClassQuery) {
const activityClasses = await activityClassRepository.list({ language });

return activityClasses.map((activityClass) => map(activityClass));
const enrichedActivityClasses = await Promise.all(activityClasses.map(async (activityClass) => {
const classInfo = await db.renamedclass.findUnique({
where: { id: Number(activityClass.class_id) },
});

const enrichedClass = {
...activityClass,
id: Number(activityClass.id),
class: {
id: String(activityClass.class_id),
name: language === "vi" ? classInfo?.vi_name ?? '' : classInfo?.en_name ?? '',
description: language === "vi" ? classInfo?.vi_description ?? '' : classInfo?.en_description ?? '',
image: classInfo?.image ?? null,
},
};

const activityClassDTO: ActivityClassDTO = {
id: enrichedClass.id ?? null,
class: {
id: enrichedClass.class.id,
name: enrichedClass.class.name ?? null,
description: enrichedClass.class.description ?? null,
image: enrichedClass.class.image ?? null,
},
name: enrichedClass.name ?? null,
image_url: enrichedClass.image_url ?? null,
status: enrichedClass.status,
order: enrichedClass.order ?? null,
created_at: enrichedClass.created_at?.toISOString() ?? null,
updated_at: enrichedClass.updated_at?.toISOString() ?? null,
created_by: enrichedClass.created_by ?? null,
updated_by: enrichedClass.updated_by ?? null,
};

return activityClassDTO;
}));

return enrichedActivityClasses.map((activityClass) => map(activityClass));
};
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ActivityClassEntity } from "@domain/entities/activity-class";

export interface ActivityClassesRepository {
list(): Promise<Array<ActivityClassEntity>>;
list(params: { language: string }): Promise<Array<ActivityClassEntity>>;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { StudentResultEntity } from "@domain/entities/student-result";

export interface StudentResultsRepository {
list(): Promise<Array<StudentResultEntity>>;
list(params: { language: string }): Promise<Array<StudentResultEntity>>;
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import { StudentResultDTO } from "@domain/dtos/student-result";
import { StudentResultEntity } from "@domain/entities";

export function map(studentResult: StudentResultEntity): StudentResultDTO {
export function map(studentResult: StudentResultDTO): StudentResultDTO {
return {
id: studentResult.id ?? null,
class_name: studentResult.class_name ?? null,
class: {
id: String(studentResult?.class?.id),
name: studentResult?.class?.name ?? null,
description: studentResult?.class?.description ?? null,
image: studentResult?.class?.image ?? null,
},
name: studentResult.name ?? null,
description: studentResult.description ?? null,
result_image: studentResult.result_image,
order: studentResult.order ?? null,
status: studentResult.status,
created_at: studentResult.created_at?.toISOString() ?? null,
updated_at: studentResult.updated_at?.toISOString() ?? null,
created_at: studentResult.created_at ?? null,
updated_at: studentResult.updated_at ?? null,
created_by: studentResult.created_by ?? null,
updated_by: studentResult.updated_by ?? null,
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,52 @@
import { StudentResultDTO } from "@domain/dtos/student-result";
import { map } from "./list-student-result-query-mapper";

export function makeListStudentResultQuery({ studentResultRepository }: Pick<Dependencies, 'studentResultRepository'>) {
return async function listStudentResultQuery() {
export type ListStudentResultQuery = Readonly<{
language: string;
}>;

const studentResults = await studentResultRepository.list();
export function makeListStudentResultQuery({ studentResultRepository, db }: Pick<Dependencies, 'studentResultRepository' | 'db'>) {
return async function listStudentResultQuery({ language }: ListStudentResultQuery) {

return studentResults.map((studentResult) => map(studentResult));
const studentResults = await studentResultRepository.list({ language });

const enrichedStudentResults = await Promise.all(studentResults.map(async (studentResult) => {
const classInfo = await db.renamedclass.findUnique({
where: { id: Number(studentResult.class_id) },
});

const enrichedStudentResult = {
...studentResult,
class: {
id: String(studentResult.class_id),
name: language === "vi" ? classInfo?.vi_name ?? '' : classInfo?.en_name ?? '',
description: language === "vi" ? classInfo?.vi_description ?? '' : classInfo?.en_description ?? '',
image: classInfo?.image ?? null,
},
};

const studentResultDTO: StudentResultDTO = {
id: enrichedStudentResult.id ?? null,
class: {
id: enrichedStudentResult.class.id,
name: enrichedStudentResult.class.name ?? null,
description: enrichedStudentResult.class.description ?? null,
image: enrichedStudentResult.class.image ?? null,
},
name: enrichedStudentResult.name ?? null,
description: enrichedStudentResult.description ?? null,
result_image: enrichedStudentResult.result_image ?? '',
order: enrichedStudentResult.order ?? null,
status: enrichedStudentResult.status,
created_at: enrichedStudentResult.created_at?.toISOString() ?? null,
updated_at: enrichedStudentResult.updated_at?.toISOString() ?? null,
created_by: enrichedStudentResult.created_by ?? null,
updated_by: enrichedStudentResult.updated_by ?? null,
};

return studentResultDTO;
}));

return enrichedStudentResults.map((studentResult) => map(studentResult));
};
}
8 changes: 8 additions & 0 deletions src/domain/dtos/activity-class.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export interface ActivityClassDTO {
id: number | null;
class: IClass;
name: string | null;
image_url: string | null;
status: number;
Expand All @@ -9,3 +10,10 @@ export interface ActivityClassDTO {
created_by: string | null;
updated_by: string | null;
}

interface IClass {
id: string;
name: string | null;
description: string | null;
image: string | null;
}
9 changes: 8 additions & 1 deletion src/domain/dtos/student-result.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export interface StudentResultDTO {
id: number | null;
class_name: string | null;
class: IClass;
name: string | null;
description: string | null;
result_image: string;
Expand All @@ -11,3 +11,10 @@ export interface StudentResultDTO {
created_by: string | null;
updated_by: string | null;
}

interface IClass {
id: string;
name: string | null;
description: string | null;
image: string | null;
}
3 changes: 3 additions & 0 deletions src/domain/entities/activity-class.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export class ActivityClassEntity {
public id?: number;
public class_id: number;
public name?: string | null;
public image_url?: string | null;
public status: number;
Expand All @@ -11,6 +12,7 @@ export class ActivityClassEntity {

constructor(activityClassEntity: {
id?: number;
class_id: number;
name?: string;
image_url?: string;
status: number;
Expand All @@ -21,6 +23,7 @@ export class ActivityClassEntity {
updated_by?: string;
}) {
this.id = activityClassEntity.id;
this.class_id = activityClassEntity.class_id;
this.name = activityClassEntity.name;
this.image_url = activityClassEntity.image_url;
this.status = activityClassEntity.status;
Expand Down
6 changes: 3 additions & 3 deletions src/domain/entities/student-result.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export class StudentResultEntity {
public id?: number;
public class_name?: string | null;
public class_id: number;
public name?: string | null;
public description?: string | null;
public result_image: string;
Expand All @@ -13,7 +13,7 @@ export class StudentResultEntity {

constructor(studentResultEntity: {
id?: number;
class_name?: string;
class_id: number;
name?: string;
description?: string;
result_image: string;
Expand All @@ -25,7 +25,7 @@ export class StudentResultEntity {
updated_by?: string;
}) {
this.id = studentResultEntity.id;
this.class_name = studentResultEntity.class_name;
this.class_id = studentResultEntity.class_id;
this.name = studentResultEntity.name;
this.description = studentResultEntity.description;
this.result_image = studentResultEntity.result_image;
Expand Down
10 changes: 5 additions & 5 deletions src/infrastructure/repositories/activity-classes-repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ export function makeActivityClassesRepository({ db }: Dependencies): ActivityCla
async list() {
const activityClasses = await db.activity_class.findMany({
where: { status: 1 },
orderBy: {
order: 'asc',
},
orderBy: { order: 'asc' },
});

return activityClasses.map(activityClass => ({
...activityClass,
id: Number(activityClass.id),
class_id: Number(activityClass.class_id),
}));
}
}
},
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export function makeStudentResultsRepository({ db }: Dependencies): StudentResul
return studentResults.map(studentResult => ({
...studentResult,
id: Number(studentResult.id),
class_id: Number(studentResult.class_id),
}));
}
}
Expand Down
14 changes: 11 additions & 3 deletions src/web/routes/activity-class.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
import { FastifyRequest } from 'fastify';

import { makeActivityClassUseCases } from '@application/activity-class';
import { ListActivitClassQuery } from '@application/activity-class/queries/list-activity-class';
import ResponseBase from '@application/common/response-base';

export default async function activityClassRoutes(fastify: FastifyRouteInstance) {
const activityClass = makeActivityClassUseCases(fastify.diContainer.cradle);

fastify.route({
method: 'GET',
method: 'POST',
url: '/api/activity-class/all',
schema: {
body: {
type: 'object',
properties: {
language: { type: 'string', description: 'Language code (e.g., vi, en, etc.)' },
},
required: ['language'],
},
response: {
200: {
type: 'object',
Expand Down Expand Up @@ -40,11 +48,11 @@ export default async function activityClassRoutes(fastify: FastifyRouteInstance)
tags: ['activity-classes'],
},
async handler(
req: FastifyRequest,
req: FastifyRequest<{ Body: ListActivitClassQuery }>,
res
) {
try {
const activtyClassList = await activityClass.queries.listActivityClasses();
const activtyClassList = await activityClass.queries.listActivityClasses({ language: req.body.language });

const response = ResponseBase.formatBaseResponse(
200,
Expand Down
14 changes: 11 additions & 3 deletions src/web/routes/student-result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@ import { FastifyRequest } from 'fastify';

import { makeStudentResultUseCases } from '@application/student-result';
import ResponseBase from '@application/common/response-base';
import { ListStudentResultQuery } from '@application/student-result/queries/list-student-result';

export default async function studentResultRoutes(fastify: FastifyRouteInstance) {
const studentResult = makeStudentResultUseCases(fastify.diContainer.cradle);

fastify.route({
method: 'GET',
method: 'POST',
url: '/api/student-result/all',
schema: {
body: {
type: 'object',
properties: {
language: { type: 'string', description: 'Language code (e.g., vi, en, etc.)' },
},
required: ['language'],
},
response: {
200: {
type: 'object',
Expand Down Expand Up @@ -42,11 +50,11 @@ export default async function studentResultRoutes(fastify: FastifyRouteInstance)
tags: ['student-results'],
},
async handler(
req: FastifyRequest,
req: FastifyRequest<{ Body: ListStudentResultQuery }>,
res
) {
try {
const studentResultList = await studentResult.queries.listStudentResults();
const studentResultList = await studentResult.queries.listStudentResults({ language: req.body.language });

const response = ResponseBase.formatBaseResponse(
200,
Expand Down

0 comments on commit 4f40289

Please sign in to comment.