Skip to content

Commit

Permalink
Merge pull request #25 from JarodCouprie/feat/sirh_39_organisation
Browse files Browse the repository at this point in the history
Feat/sirh 39 organisation
  • Loading branch information
JarodCouprie authored Sep 2, 2024
2 parents b9084d9 + 92090a1 commit 949a3b9
Show file tree
Hide file tree
Showing 77 changed files with 3,769 additions and 598 deletions.
4 changes: 2 additions & 2 deletions api-server/sql/db.sql
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,15 @@ CREATE TABLE team
id_service BIGINT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_user_lead_team) REFERENCES users (id),
FOREIGN KEY (id_service) REFERENCES service (id)
FOREIGN KEY (id_service) REFERENCES service (id) ON DELETE CASCADE
);

CREATE TABLE belong_team
(
id_team BIGINT,
id_user BIGINT,
PRIMARY KEY (id_team, id_user),
FOREIGN KEY (id_team) REFERENCES team (id),
FOREIGN KEY (id_team) REFERENCES team (id) ON DELETE CASCADE,
FOREIGN KEY (id_user) REFERENCES users (id)
);

Expand Down
10 changes: 10 additions & 0 deletions api-server/src/common/model/Department.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,31 @@ export class Department {
minimum_users: number;
id_user_lead_service: number;
id_agency: number;
lead_service_firstname: string;
lead_service_lastname: string;
team_count: number;

constructor(
id: number,
label: string,
minimum_users: number,
id_user_lead_service: number,
id_agency: number,
lead_service_firstname: string,
lead_service_lastname: string,
team_count: number,
) {
this.id = id;
this.label = label;
this.minimum_users = minimum_users;
this.id_user_lead_service = id_user_lead_service;
this.id_agency = id_agency;
this.lead_service_firstname = lead_service_firstname;
this.lead_service_lastname = lead_service_lastname;
this.team_count = team_count;
}
}

export class CreateDepartment {
label: string;
minimum_users: number;
Expand Down
61 changes: 58 additions & 3 deletions api-server/src/common/model/Team.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,78 @@ export class Team {
id: number;
label: string;
minimum_users: number;
id_user_lead_service: number;
id_user_lead_team: number;
id_service: number;
service_label: string;
lead_team_firstname: string;
lead_team_lastname: string;
lead_team_email: string;
members: TeamMembers[];
is_present: number | null;

constructor(
id: number,
label: string,
minimum_users: number,
id_user_lead_service: number,
id_user_lead_team: number,
id_service: number,
service_label: string,
lead_team_firstname: string,
lead_team_lastname: string,
lead_team_email: string,
members: TeamMembers[],
is_present: number | null,
) {
this.id = id;
this.label = label;
this.minimum_users = minimum_users;
this.id_user_lead_service = id_user_lead_service;
this.id_user_lead_team = id_user_lead_team;
this.id_service = id_service;
this.service_label = service_label;
this.lead_team_firstname = lead_team_firstname;
this.lead_team_lastname = lead_team_lastname;
this.lead_team_email = lead_team_email;
this.members = members;
this.is_present = is_present;
}
}

export class TeamMembers {
id_member: number;
member_firstname: string;
member_lastname: string;
member_email: string;
member_avatar: string;
is_present: number;

constructor(member: any) {
this.id_member = member.id_member;
this.member_firstname = member.member_firstname;
this.member_lastname = member.member_lastname;
this.member_email = member.member_email;
this.member_avatar = member.member_avatar;
this.is_present = member.is_present;
}
}

export class CreateTeam {
label: string;
minimum_users: number;
id_user_lead_team: number;
id_service: number;
members: number[];

constructor(
label: string,
minimum_users: number,
id_user_lead_team: number,
id_service: number,
members: number[],
) {
this.label = label;
this.minimum_users = minimum_users;
this.id_user_lead_team = id_user_lead_team;
this.id_service = id_service;
this.members = members;
}
}
13 changes: 13 additions & 0 deletions api-server/src/resources/agency/AgencyController.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Request, Response, Router } from "express";
import { verifyToken } from "../../common/middleware/AuthMiddleware.js";
import { AgencyService } from "./AgencyService.js";
import { CustomRequest } from "../../common/helper/CustomRequest.js";
import { DemandService } from "../demand/DemandService.js";

const router = Router();

Expand Down Expand Up @@ -47,4 +49,15 @@ router.post(
},
);

router.delete(
"/:id_agency",
verifyToken,
async (req: Request, res: Response) => {
const { code, message, data } = await AgencyService.deleteAgency(
+req.params.id_agency,
);
res.status(code).json({ message, data });
},
);

export default router;
49 changes: 48 additions & 1 deletion api-server/src/resources/agency/AgencyRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export class AgencyRepository {

public static async getDemandGroupedByMonth() {
const [rows] = await this.pool.query(
`SELECT DATE_FORMAT(created_at, '%Y-%m') AS date,
`SELECT DATE_FORMAT(start_date, '%Y-%m') AS date,
COUNT(*) AS count
FROM demand
WHERE status = 'ACCEPTED'
Expand All @@ -83,6 +83,41 @@ export class AgencyRepository {
);
return rows;
}
public static async getDemandGroupedByWeek() {
const [rows] = await this.pool.query(
`SELECT DATE_FORMAT(start_date, '%Y-%m-%d') AS date,
COUNT(*) AS count
FROM demand
WHERE status = 'ACCEPTED'
AND WEEKDAY(start_date) IN (0, 4)
GROUP BY date
ORDER BY date`,
);
return rows;
}

public static async countUserInAgency(idAgency: number) {
const [result]: any = await this.pool.query(
`
SELECT agency.label AS agency_name,
COUNT(users.id) AS total_users,
COUNT(CASE WHEN demand.id IS NULL THEN 1 END) AS total_present,
COUNT(CASE WHEN demand.id IS NOT NULL THEN 1 END) AS total_absent
FROM users
JOIN belong_team ON users.id = belong_team.id_user
JOIN team ON belong_team.id_team = team.id
JOIN service ON team.id_service = service.id
JOIN agency ON service.id_agency = agency.id
LEFT JOIN demand ON users.id = demand.id_owner
AND demand.status = 'ACCEPTED'
AND CURDATE() BETWEEN demand.start_date AND demand.end_date
WHERE agency.id = ?
GROUP BY agency.label;
`,
[idAgency],
);
return result;
}

public static async createAgency(agency: CreateAgency) {
const [rows]: any = await this.pool.query(
Expand All @@ -95,4 +130,16 @@ export class AgencyRepository {
);
return rows[0];
}

public static async deleteAgency(id: number) {
const [rows]: any = await this.pool.query(
`
DELETE
FROM agency
WHERE id = ?;
`,
[id],
);
return rows[0];
}
}
25 changes: 24 additions & 1 deletion api-server/src/resources/agency/AgencyService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import { logger } from "../../common/helper/Logger.js";
import { AgencyRepository } from "./AgencyRepository.js";
import { AgencyCoord, AgencyDTO, AgencyList } from "./dto/AgencyDTO.js";
import { AgencyEntity } from "../../common/entity/agency/agency.entity.js";
import { DemandRepository } from "../demand/DemandRepository.js";
import { UserService } from "../user/UserService.js";
import { updateUserDays } from "../demand/DemandService.js";

export class AgencyService {
public static async getAgency(req: Request) {
Expand Down Expand Up @@ -62,6 +65,12 @@ export class AgencyService {

public static async getDemandGroupedByMonthData(req: Request) {
const agencyData: any = await AgencyRepository.getDemandGroupedByMonth();
console.log(agencyData);
const weekData: any = await AgencyRepository.getDemandGroupedByWeek();
console.log(weekData);
const userAgency: any = await AgencyRepository.countUserInAgency(1);
console.log(userAgency);

return new ControllerResponse(200, "", agencyData);
}

Expand Down Expand Up @@ -157,7 +166,6 @@ export class AgencyService {
return new ControllerResponse(401, "L'agence n'existe pas");
}
const agencyToSend = new AgencyList(agency);

return new ControllerResponse<AgencyList>(
200,
"Adresse de l'agence modifiée",
Expand All @@ -171,4 +179,19 @@ export class AgencyService {
);
}
}

public static async deleteAgency(id: number) {
try {
const agency: any = await AgencyRepository.getAgencyById(+id);

if (!agency) {
return new ControllerResponse(404, "pas d'agence");
}
await AgencyRepository.deleteAgency(+id);
return new ControllerResponse(200, "");
} catch (error) {
logger.error(`Failed to delete the agency. Error: ${error}`);
return new ControllerResponse(500, "Failed to delete the agency");
}
}
}
8 changes: 6 additions & 2 deletions api-server/src/resources/demand/DemandController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@ const upload = multer({
limits: { fileSize: 50 * 1024 * 1024 }, // Set the file size limit (50MB in this case)
});

router.get("/", verifyToken, async (req: Request, res: Response) => {
router.get("/list/:type", verifyToken, async (req: Request, res: Response) => {
let userId = (req as CustomRequest).token.userId;
const { code, message, data } = await DemandService.getDemand(userId, req);
const { code, message, data } = await DemandService.getDemand(
userId,
req,
req.params.type,
);
res.status(code).json({ message, data });
});

Expand Down
5 changes: 2 additions & 3 deletions api-server/src/resources/demand/DemandService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,10 @@ export function updateUserDays(
}

export class DemandService {
public static async getDemand(userId: number, req: Request) {
public static async getDemand(userId: number, req: Request, type: string) {
try {
const pageSize = req.query.pageSize || "0";
const pageNumber = req.query.pageNumber || "10";
const type = req.query.type?.toString() || "";
const limit = +pageSize;
const offset = (+pageNumber - 1) * +pageSize;
let demandCount = await DemandRepository.getDemandCountWithType(type);
Expand All @@ -111,7 +110,7 @@ export class DemandService {
offset,
type,
);
if (!type) {
if (type === "All") {
demands = await DemandRepository.getDemandByUser(userId, limit, offset);
demandCount = await DemandRepository.geCountByUserId(userId);
}
Expand Down
39 changes: 39 additions & 0 deletions api-server/src/resources/department/DepartmentController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,20 @@ router.get("/:id", verifyToken, async (req: Request, res: Response) => {
});
});

router.get(
"/department/:id",
verifyToken,
async (req: Request, res: Response) => {
const { code, message, data } = await DepartmentService.getDepartmentById(
+req.params.id,
);
res.status(code).json({
message,
data,
});
},
);

router.post("/create/:id", verifyToken, async (req: Request, res: Response) => {
const { code, message, data } = await DepartmentService.createDepartment(
+req.params.id,
Expand All @@ -26,4 +40,29 @@ router.post("/create/:id", verifyToken, async (req: Request, res: Response) => {
});
});

router.post(
"/update-info/:id_department",
verifyToken,
async (req: Request, res: Response) => {
const { code, message, data } = await DepartmentService.updateDepartment(
+req.params.id_department,
req,
);
res.status(code).json({
message,
data,
});
},
);

router.delete("/:id", verifyToken, async (req: Request, res: Response) => {
const { code, message, data } = await DepartmentService.deleteDepartment(
+req.params.id,
);
res.status(code).json({
message,
data,
});
});

export default router;
Loading

0 comments on commit 949a3b9

Please sign in to comment.