Merge pull request #171 from SELab-2/feat/question-routes
feat: Question en Answer routes
This commit is contained in:
		
						commit
						1405fd66d1
					
				
					 32 changed files with 815 additions and 218 deletions
				
			
		
							
								
								
									
										39
									
								
								frontend/src/controllers/answers.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								frontend/src/controllers/answers.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| import type { AnswerData, AnswerDTO, AnswerId } from "@dwengo-1/common/interfaces/answer"; | ||||
| import { BaseController } from "@/controllers/base-controller.ts"; | ||||
| import type { QuestionId } from "@dwengo-1/common/interfaces/question"; | ||||
| 
 | ||||
| export interface AnswersResponse { | ||||
|     answers: AnswerDTO[] | AnswerId[]; | ||||
| } | ||||
| 
 | ||||
| export interface AnswerResponse { | ||||
|     answer: AnswerDTO; | ||||
| } | ||||
| 
 | ||||
| export class AnswerController extends BaseController { | ||||
|     constructor(questionId: QuestionId) { | ||||
|         this.loId = questionId.learningObjectIdentifier; | ||||
|         this.sequenceNumber = questionId.sequenceNumber; | ||||
|         super(`learningObject/${loId.hruid}/:${loId.version}/questions/${this.sequenceNumber}/answers`); | ||||
|     } | ||||
| 
 | ||||
|     async getAll(full = true): Promise<AnswersResponse> { | ||||
|         return this.get<AnswersResponse>("/", { lang: this.loId.lang, full }); | ||||
|     } | ||||
| 
 | ||||
|     async getBy(seq: number): Promise<AnswerResponse> { | ||||
|         return this.get<AnswerResponse>(`/${seq}`, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async create(answerData: AnswerData): Promise<AnswerResponse> { | ||||
|         return this.post<AnswerResponse>("/", answerData, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async remove(seq: number): Promise<AnswerResponse> { | ||||
|         return this.delete<AnswerResponse>(`/${seq}`, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async update(seq: number, answerData: AnswerData): Promise<AnswerResponse> { | ||||
|         return this.put<AnswerResponse>(`/${seq}`, answerData, { lang: this.loId.lang }); | ||||
|     } | ||||
| } | ||||
|  | @ -21,20 +21,20 @@ export abstract class BaseController { | |||
|         return response.data; | ||||
|     } | ||||
| 
 | ||||
|     protected async post<T>(path: string, body: unknown): Promise<T> { | ||||
|         const response = await apiClient.post<T>(this.absolutePathFor(path), body); | ||||
|     protected async post<T>(path: string, body: unknown, queryParams?: QueryParams): Promise<T> { | ||||
|         const response = await apiClient.post<T>(this.absolutePathFor(path), body, { params: queryParams }); | ||||
|         BaseController.assertSuccessResponse(response); | ||||
|         return response.data; | ||||
|     } | ||||
| 
 | ||||
|     protected async delete<T>(path: string): Promise<T> { | ||||
|         const response = await apiClient.delete<T>(this.absolutePathFor(path)); | ||||
|     protected async delete<T>(path: string, queryParams?: QueryParams): Promise<T> { | ||||
|         const response = await apiClient.delete<T>(this.absolutePathFor(path), { params: queryParams }); | ||||
|         BaseController.assertSuccessResponse(response); | ||||
|         return response.data; | ||||
|     } | ||||
| 
 | ||||
|     protected async put<T>(path: string, body: unknown): Promise<T> { | ||||
|         const response = await apiClient.put<T>(this.absolutePathFor(path), body); | ||||
|     protected async put<T>(path: string, body: unknown, queryParams?: QueryParams): Promise<T> { | ||||
|         const response = await apiClient.put<T>(this.absolutePathFor(path), body, { params: queryParams }); | ||||
|         BaseController.assertSuccessResponse(response); | ||||
|         return response.data; | ||||
|     } | ||||
|  |  | |||
|  | @ -1,5 +1,38 @@ | |||
| import type { QuestionDTO, QuestionId } from "@dwengo-1/common/interfaces/question"; | ||||
| import type { QuestionData, QuestionDTO, QuestionId } from "@dwengo-1/common/interfaces/question"; | ||||
| import { BaseController } from "@/controllers/base-controller.ts"; | ||||
| import type { LearningObjectIdentifierDTO } from "@dwengo-1/common/interfaces/learning-content"; | ||||
| 
 | ||||
| export interface QuestionsResponse { | ||||
|     questions: QuestionDTO[] | QuestionId[]; | ||||
| } | ||||
| 
 | ||||
| export interface QuestionResponse { | ||||
|     question: QuestionDTO; | ||||
| } | ||||
| 
 | ||||
| export class QuestionController extends BaseController { | ||||
|     constructor(loId: LearningObjectIdentifierDTO) { | ||||
|         this.loId = loId; | ||||
|         super(`learningObject/${loId.hruid}/:${loId.version}/questions`); | ||||
|     } | ||||
| 
 | ||||
|     async getAll(full = true): Promise<QuestionsResponse> { | ||||
|         return this.get<QuestionsResponse>("/", { lang: this.loId.lang, full }); | ||||
|     } | ||||
| 
 | ||||
|     async getBy(sequenceNumber: number): Promise<QuestionResponse> { | ||||
|         return this.get<QuestionResponse>(`/${sequenceNumber}`, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async create(questionData: QuestionData): Promise<QuestionResponse> { | ||||
|         return this.post<QuestionResponse>("/", questionData, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async remove(sequenceNumber: number): Promise<QuestionResponse> { | ||||
|         return this.delete<QuestionResponse>(`/${sequenceNumber}`, { lang: this.loId.lang }); | ||||
|     } | ||||
| 
 | ||||
|     async update(sequenceNumber: number, questionData: QuestionData): Promise<QuestionResponse> { | ||||
|         return this.put<QuestionResponse>(`/${sequenceNumber}`, questionData, { lang: this.loId.lang }); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl