diff --git a/questionpy_sdk/webserver/routes/attempt.py b/questionpy_sdk/webserver/routes/attempt.py index ec92edae..7687edc6 100644 --- a/questionpy_sdk/webserver/routes/attempt.py +++ b/questionpy_sdk/webserver/routes/attempt.py @@ -47,7 +47,7 @@ async def post(self) -> web.Response: data = await self.request.json() await self.controller.save_attempt(question_id, attempt_id, data) - return web.Response() + return self.json_success_response() async def delete(self) -> web.Response: """Deletes the attempt from the state storage.""" @@ -59,7 +59,7 @@ async def delete(self) -> web.Response: except webserver_errors.MissingAttemptStateError as err: raise HTTPNotFound from err - return web.json_response() + return self.json_success_response() @routes.view(f"/question/{{question_id:{ID_RE}}}/attempts", name="attempt.list") @@ -82,7 +82,7 @@ async def post(self) -> web.Response: await self.controller.score_attempt(question_id, attempt_id) except webserver_errors.MissingStateError as err: raise web.HTTPBadRequest(text=str(err)) from err - return web.Response() + return self.json_success_response() @routes.view( @@ -103,4 +103,4 @@ async def post(self) -> web.Response: except webserver_errors.DuplicateAttemptError as err: raise web.HTTPConflict(text=str(err)) from err - return web.Response() + return self.json_success_response() diff --git a/questionpy_sdk/webserver/routes/base.py b/questionpy_sdk/webserver/routes/base.py index 16a7562d..2f5b74cf 100644 --- a/questionpy_sdk/webserver/routes/base.py +++ b/questionpy_sdk/webserver/routes/base.py @@ -29,3 +29,7 @@ def controller(self) -> CT: def json_model_response(self, model: BaseModel, **kwargs: Any) -> web.Response: """Create JSON response from model using Pydantic's serializer.""" return web.json_response(text=model.model_dump_json(**kwargs)) + + def json_success_response(self, msg: str = "Success") -> web.Response: + """Create JSON response signalling success.""" + return web.json_response({"msg": msg}) diff --git a/questionpy_sdk/webserver/routes/question.py b/questionpy_sdk/webserver/routes/question.py index 7faa5713..d1a76e42 100644 --- a/questionpy_sdk/webserver/routes/question.py +++ b/questionpy_sdk/webserver/routes/question.py @@ -35,7 +35,7 @@ async def delete(self) -> web.Response: except MissingQuestionStateError as err: raise HTTPNotFound from err - return web.json_response() + return self.json_success_response() @routes.view("/questions", name="question.list") @@ -48,7 +48,7 @@ async def get(self) -> web.Response: async def delete(self) -> web.Response: """Deletes all questions and its attempts from the state storage.""" await self.controller.delete_all_questions() - return web.json_response() + return self.json_success_response() @routes.view(f"/question/{{question_id:{ID_RE}}}/state", name="question.state") @@ -69,7 +69,7 @@ async def post(self) -> web.Response: except OptionsFormValidationError as err: return web.json_response(err.errors, status=HTTPUnprocessableEntity.status_code) - return web.json_response() + return self.json_success_response() @routes.view(f"/question/{{question_id:{ID_RE}}}/clone/{{new_question_id:{ID_RE}}}", name="question.clone") @@ -86,4 +86,4 @@ async def post(self) -> web.Response: except DuplicateQuestionError as err: raise web.HTTPConflict(text=str(err)) from err - return web.Response() + return self.json_success_response()