1- import { NextFunction , Request , Response } from "express" ;
1+ import { Request , Response } from "express" ;
22import * as achievementService from "../services/achievement.service" ;
3+ import { uploadImage } from "../utils/imageUtils" ;
4+ import { supabase } from "../app" ;
35import { ApiError } from "../utils/apiError" ;
46
57export const getAchievements = async ( req : Request , res : Response ) => {
@@ -36,43 +38,34 @@ export const getAchievementById = async (req: Request, res: Response) => {
3638 } ) ;
3739} ;
3840
41+ export const createAchievement = async ( req : Request , res : Response ) => {
42+ const file = req . file ;
43+ if ( ! file ) {
44+ throw new ApiError ( 'Image file is not found' , 400 ) ;
45+ }
3946
40- // export const createAchievement = async (req: Request, res: Response) => {
41- // const { title, achievedAt, imageUrl} = req.body;
42-
43- // if (!title || !achievedAt ) {
44- // throw new ApiError("title, achievedAt, and adminId are required", 400);
45- // }
46-
47- // const newAchievement = await achievementService.createAchievement({
48- // title,
49- // achievedAt,
50- // imageUrl,
51- // });
52-
53- // res.status(201).json({
54- // success: true,
55- // data: newAchievement,
56- // });
57- // };
58-
47+ const imageUrl = await uploadImage ( supabase , file , 'achievements' ) ;
48+ if ( ! imageUrl ) {
49+ throw new ApiError ( 'Image URL is missing' , 400 ) ;
50+ }
5951
60- export const createAchievement = async ( req : Request , res : Response ) => {
61- const { title, achievedAt, imageUrl, memberIds } = req . body ;
52+ const { title, description, achievedAt, memberIds, createdById } = req . body . achievementData ;
6253
63- if ( ! title || ! achievedAt ) {
64- throw new ApiError ( " Title, achievedAt, and adminId are required" , 400 ) ;
54+ if ( ! title || ! description || ! achievedAt || ! createdById ) {
55+ throw new ApiError ( ' Title, description, achievedAt, and createdById are required' , 400 ) ;
6556 }
6657
6758 if ( ! Array . isArray ( memberIds ) ) {
68- throw new ApiError ( " memberIds must be an array" , 400 ) ;
59+ throw new ApiError ( ' memberIds must be an array' , 400 ) ;
6960 }
7061
7162 const achievement = await achievementService . createAchievement ( {
7263 title,
64+ description,
7365 achievedAt,
7466 imageUrl,
7567 memberIds,
68+ createdById,
7669 } ) ;
7770
7871 res . status ( 201 ) . json ( {
@@ -82,67 +75,69 @@ export const createAchievement = async (req: Request, res: Response) => {
8275} ;
8376
8477
85- // export const addMemberToAchievement = async (req: Request, res: Response) => {
86- // const achievementId = parseInt(req.params.achievementId);
87- // const { memberId } = req.body;
88-
89- // if (!achievementId || isNaN(achievementId)) {
90- // throw new ApiError("Invalid achievement ID", 400);
91- // }
92-
93- // if (!memberId) {
94- // throw new ApiError("Member ID is required", 400);
95- // }
96-
97- // const newLink = await achievementService.addMemberToAchievement({
98- // achievementId,
99- // memberId,
100- // });
101-
102- // res.status(201).json({
103- // success: true,
104- // data: newLink,
105- // });
106- // };
107-
108-
10978export const updateAchievementById = async ( req : Request , res : Response ) => {
11079 const achievementId = parseInt ( req . params . achievementId ) ;
111-
11280 if ( ! achievementId || isNaN ( achievementId ) ) {
11381 throw new ApiError ( "Invalid achievement ID" , 400 ) ;
11482 }
11583
116- const { title, achievedAt, imageUrl, memberIds } = req . body ;
84+ const file = req . file ;
85+ let imageUrl : string | undefined ;
11786
118- // if (!adminId ) {
119- // return next(new ApiError("Admin ID is required", 400) );
120- // }
87+ if ( file ) {
88+ imageUrl = await uploadImage ( supabase , file , 'achievements' ) ;
89+ }
12190
91+ let achievementData = req . body . achievementData ;
92+ if ( typeof achievementData === 'string' ) {
93+ try {
94+ achievementData = JSON . parse ( achievementData ) ;
95+ } catch ( e ) {
96+ throw new ApiError ( "Invalid JSON in achievementData field" , 400 ) ;
97+ }
98+ }
99+
100+ const { title, description, achievedAt, updatedById, memberIds } = achievementData ;
101+
102+ if ( ! updatedById ) {
103+ throw new ApiError ( "updatedById is required" , 400 ) ;
104+ }
122105
123- const existingAchievement = await achievementService . getAchievementById ( achievementId ) ;
106+ if (
107+ ! title &&
108+ ! description &&
109+ ! achievedAt &&
110+ ! imageUrl &&
111+ ( ! Array . isArray ( memberIds ) || memberIds . length === 0 )
112+ ) {
113+ throw new ApiError ( "At least one field must be provided for update" , 400 ) ;
114+ }
124115
116+ const existingAchievement = await achievementService . getAchievementById ( achievementId ) ;
125117 if ( ! existingAchievement ) {
126118 throw new ApiError ( "Achievement not found" , 404 ) ;
127119 }
128120
129- const updatedAchievement = await achievementService . updateAchievementById ( achievementId , {
130- title,
131- achievedAt,
132- imageUrl,
133- } ) ;
121+ if ( imageUrl ) {
122+ achievementData . imageUrl = imageUrl ;
123+ }
124+
125+ const updatedAchievement = await achievementService . updateAchievementById (
126+ achievementId ,
127+ achievementData
128+ ) ;
134129
135130 if ( Array . isArray ( memberIds ) && memberIds . length > 0 ) {
136131 await achievementService . addMembersToAchievement ( achievementId , memberIds ) ;
137132 }
138133
139-
140134 res . status ( 200 ) . json ( {
141135 success : true ,
142136 data : updatedAchievement ,
143137 } ) ;
144138} ;
145139
140+
146141export const deleteAchievementById = async ( req : Request , res : Response ) => {
147142 const achievementId = parseInt ( req . params . achievementId ) ;
148143
@@ -159,16 +154,16 @@ export const deleteAchievementById = async (req: Request, res: Response) => {
159154} ;
160155
161156
162- export const removeMemberFromAchievement = async ( req : Request , res : Response , next : NextFunction ) => {
157+ export const removeMemberFromAchievement = async ( req : Request , res : Response ) => {
163158 const achievementId = parseInt ( req . params . achievementId ) ;
164- const { memberId } = req . body ;
159+ const memberId = req . params . memberId ;
165160
166161 if ( ! achievementId || isNaN ( achievementId ) ) {
167- return next ( new ApiError ( "Invalid achievement ID" , 400 ) ) ;
162+ throw new ApiError ( "Invalid achievement ID" , 400 ) ;
168163 }
169164
170165 if ( ! memberId ) {
171- return next ( new ApiError ( "Member ID is required" , 400 ) ) ;
166+ throw new ApiError ( "Member ID is required" , 400 ) ;
172167 }
173168
174169 await achievementService . removeMemberFromAchievement ( achievementId , memberId ) ;
@@ -178,3 +173,4 @@ export const removeMemberFromAchievement = async (req: Request, res: Response, n
178173 message : "Member removed from achievement successfully" ,
179174 } ) ;
180175} ;
176+
0 commit comments