퀴즈 풀기/점수
This commit is contained in:
		
							
								
								
									
										15
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
{
 | 
			
		||||
  // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
 | 
			
		||||
  // 기존 특성에 대한 설명을 보려면 가리킵니다.
 | 
			
		||||
  // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
 | 
			
		||||
  "version": "0.2.0",
 | 
			
		||||
  "configurations": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": "Launch Package",
 | 
			
		||||
      "type": "go",
 | 
			
		||||
      "request": "launch",
 | 
			
		||||
      "mode": "auto",
 | 
			
		||||
      "program": "${fileDirname}"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										482
									
								
								docs/docs.go
									
									
									
									
									
								
							
							
						
						
									
										482
									
								
								docs/docs.go
									
									
									
									
									
								
							@@ -273,6 +273,304 @@ const docTemplate = `{
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "목록을 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "목록 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "검색어",
 | 
			
		||||
                        "name": "q",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지",
 | 
			
		||||
                        "name": "page",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지 사이즈",
 | 
			
		||||
                        "name": "limit",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperListResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "ID로 페이퍼 정보를 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "페이퍼 정보 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/finish": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 종료합니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 종료",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.Paper"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈페이퍼 퀴즈 목록을 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈페이퍼 퀴즈 목록 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "퀴즈페이퍼 ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지",
 | 
			
		||||
                        "name": "page",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지 사이즈",
 | 
			
		||||
                        "name": "limit",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.UserQuizListResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz/{quiz_id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "ID로 퀴즈를 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈페이퍼 퀴즈 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "사용자퀴즈 ID",
 | 
			
		||||
                        "name": "quiz_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.UserQuizResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz/{quiz_id}/answer": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 답변을 제출합니다..",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 답변",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Quiz ID",
 | 
			
		||||
                        "name": "quiz_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "description": "Answer Body",
 | 
			
		||||
                        "name": "quizBody",
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {}
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/start": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 시작합니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 시작",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.Paper"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/quiz": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
@@ -982,6 +1280,43 @@ const docTemplate = `{
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "사용자퀴즈 답변을 제출합니다..",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "사용자퀴즈"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "사용자퀴즈 답변",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Quiz ID",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "description": "Answer Body",
 | 
			
		||||
                        "name": "quizBody",
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {}
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/userquizpaper": {
 | 
			
		||||
@@ -1199,6 +1534,21 @@ const docTemplate = `{
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "definitions": {
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.AnswerQuizRequest": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "answer": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    "example": [
 | 
			
		||||
                        "option1",
 | 
			
		||||
                        "option4"
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Center": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
@@ -1329,6 +1679,138 @@ const docTemplate = `{
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Paper": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "center_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "done_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "guid_id": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "7f9329f5-2e36-4638-92d2-73064b7291a4"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "quiz_paper_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000001
 | 
			
		||||
                },
 | 
			
		||||
                "start_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "status": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "wating"
 | 
			
		||||
                },
 | 
			
		||||
                "total_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 100
 | 
			
		||||
                },
 | 
			
		||||
                "user_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000002
 | 
			
		||||
                },
 | 
			
		||||
                "user_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 5
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.PaperListResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "data": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperResponse"
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                "page": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1
 | 
			
		||||
                },
 | 
			
		||||
                "pageSize": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 10
 | 
			
		||||
                },
 | 
			
		||||
                "total": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 999
 | 
			
		||||
                },
 | 
			
		||||
                "totalPage": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 99
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.PaperResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "category": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "파이썬기본"
 | 
			
		||||
                },
 | 
			
		||||
                "center_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "created_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "done_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "first_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "길순"
 | 
			
		||||
                },
 | 
			
		||||
                "guid_id": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "7f9329f5-2e36-4638-92d2-73064b7291a4"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "last_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "홍"
 | 
			
		||||
                },
 | 
			
		||||
                "quiz_paper_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000001
 | 
			
		||||
                },
 | 
			
		||||
                "start_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "status": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "wating"
 | 
			
		||||
                },
 | 
			
		||||
                "title": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "출력 Print"
 | 
			
		||||
                },
 | 
			
		||||
                "total_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 100
 | 
			
		||||
                },
 | 
			
		||||
                "user_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000002
 | 
			
		||||
                },
 | 
			
		||||
                "user_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 5
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Quiz": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
 
 | 
			
		||||
@@ -265,6 +265,304 @@
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "목록을 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "목록 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "검색어",
 | 
			
		||||
                        "name": "q",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지",
 | 
			
		||||
                        "name": "page",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지 사이즈",
 | 
			
		||||
                        "name": "limit",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperListResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "ID로 페이퍼 정보를 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "페이퍼 정보 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/finish": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 종료합니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 종료",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.Paper"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈페이퍼 퀴즈 목록을 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈페이퍼 퀴즈 목록 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "퀴즈페이퍼 ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지",
 | 
			
		||||
                        "name": "page",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "페이지 사이즈",
 | 
			
		||||
                        "name": "limit",
 | 
			
		||||
                        "in": "query"
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.UserQuizListResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz/{quiz_id}": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "ID로 퀴즈를 가져옵니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈페이퍼 퀴즈 가져오기",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "string",
 | 
			
		||||
                        "description": "사용자퀴즈 ID",
 | 
			
		||||
                        "name": "quiz_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.UserQuizResponse"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/quiz/{quiz_id}/answer": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 답변을 제출합니다..",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 답변",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Quiz ID",
 | 
			
		||||
                        "name": "quiz_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "description": "Answer Body",
 | 
			
		||||
                        "name": "quizBody",
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {}
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/paper/{paper_id}/start": {
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "퀴즈 시작합니다.",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "페이퍼"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "퀴즈 시작",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Paper ID",
 | 
			
		||||
                        "name": "paper_id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {
 | 
			
		||||
                    "200": {
 | 
			
		||||
                        "description": "OK",
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.Paper"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/quiz": {
 | 
			
		||||
            "get": {
 | 
			
		||||
                "security": [
 | 
			
		||||
@@ -974,6 +1272,43 @@
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "patch": {
 | 
			
		||||
                "security": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "Bearer": []
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "description": "사용자퀴즈 답변을 제출합니다..",
 | 
			
		||||
                "consumes": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "produces": [
 | 
			
		||||
                    "application/json"
 | 
			
		||||
                ],
 | 
			
		||||
                "tags": [
 | 
			
		||||
                    "사용자퀴즈"
 | 
			
		||||
                ],
 | 
			
		||||
                "summary": "사용자퀴즈 답변",
 | 
			
		||||
                "parameters": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "integer",
 | 
			
		||||
                        "description": "Quiz ID",
 | 
			
		||||
                        "name": "id",
 | 
			
		||||
                        "in": "path",
 | 
			
		||||
                        "required": true
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "description": "Answer Body",
 | 
			
		||||
                        "name": "quizBody",
 | 
			
		||||
                        "in": "body",
 | 
			
		||||
                        "required": true,
 | 
			
		||||
                        "schema": {
 | 
			
		||||
                            "$ref": "#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest"
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ],
 | 
			
		||||
                "responses": {}
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "/userquizpaper": {
 | 
			
		||||
@@ -1191,6 +1526,21 @@
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "definitions": {
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.AnswerQuizRequest": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "answer": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "type": "string"
 | 
			
		||||
                    },
 | 
			
		||||
                    "example": [
 | 
			
		||||
                        "option1",
 | 
			
		||||
                        "option4"
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Center": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
@@ -1321,6 +1671,138 @@
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Paper": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "center_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "done_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "guid_id": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "7f9329f5-2e36-4638-92d2-73064b7291a4"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "quiz_paper_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000001
 | 
			
		||||
                },
 | 
			
		||||
                "start_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "status": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "wating"
 | 
			
		||||
                },
 | 
			
		||||
                "total_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 100
 | 
			
		||||
                },
 | 
			
		||||
                "user_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000002
 | 
			
		||||
                },
 | 
			
		||||
                "user_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 5
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.PaperListResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "data": {
 | 
			
		||||
                    "type": "array",
 | 
			
		||||
                    "items": {
 | 
			
		||||
                        "$ref": "#/definitions/learnsteam_cslms-api_internal_models.PaperResponse"
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                "page": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1
 | 
			
		||||
                },
 | 
			
		||||
                "pageSize": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 10
 | 
			
		||||
                },
 | 
			
		||||
                "total": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 999
 | 
			
		||||
                },
 | 
			
		||||
                "totalPage": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 99
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.PaperResponse": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "category": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "파이썬기본"
 | 
			
		||||
                },
 | 
			
		||||
                "center_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "created_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "done_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "first_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "길순"
 | 
			
		||||
                },
 | 
			
		||||
                "guid_id": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "7f9329f5-2e36-4638-92d2-73064b7291a4"
 | 
			
		||||
                },
 | 
			
		||||
                "id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000015
 | 
			
		||||
                },
 | 
			
		||||
                "last_name": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "홍"
 | 
			
		||||
                },
 | 
			
		||||
                "quiz_paper_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000001
 | 
			
		||||
                },
 | 
			
		||||
                "start_at": {
 | 
			
		||||
                    "type": "string"
 | 
			
		||||
                },
 | 
			
		||||
                "status": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "wating"
 | 
			
		||||
                },
 | 
			
		||||
                "title": {
 | 
			
		||||
                    "type": "string",
 | 
			
		||||
                    "example": "출력 Print"
 | 
			
		||||
                },
 | 
			
		||||
                "total_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 100
 | 
			
		||||
                },
 | 
			
		||||
                "user_id": {
 | 
			
		||||
                    "type": "integer",
 | 
			
		||||
                    "example": 1000002
 | 
			
		||||
                },
 | 
			
		||||
                "user_score": {
 | 
			
		||||
                    "type": "number",
 | 
			
		||||
                    "example": 5
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "learnsteam_cslms-api_internal_models.Quiz": {
 | 
			
		||||
            "type": "object",
 | 
			
		||||
            "properties": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,14 @@
 | 
			
		||||
definitions:
 | 
			
		||||
  learnsteam_cslms-api_internal_models.AnswerQuizRequest:
 | 
			
		||||
    properties:
 | 
			
		||||
      answer:
 | 
			
		||||
        example:
 | 
			
		||||
        - option1
 | 
			
		||||
        - option4
 | 
			
		||||
        items:
 | 
			
		||||
          type: string
 | 
			
		||||
        type: array
 | 
			
		||||
    type: object
 | 
			
		||||
  learnsteam_cslms-api_internal_models.Center:
 | 
			
		||||
    properties:
 | 
			
		||||
      center_name:
 | 
			
		||||
@@ -92,6 +102,101 @@ definitions:
 | 
			
		||||
      user:
 | 
			
		||||
        $ref: '#/definitions/learnsteam_cslms-api_internal_models.User'
 | 
			
		||||
    type: object
 | 
			
		||||
  learnsteam_cslms-api_internal_models.Paper:
 | 
			
		||||
    properties:
 | 
			
		||||
      center_id:
 | 
			
		||||
        example: 1000015
 | 
			
		||||
        type: integer
 | 
			
		||||
      done_at:
 | 
			
		||||
        type: string
 | 
			
		||||
      guid_id:
 | 
			
		||||
        example: 7f9329f5-2e36-4638-92d2-73064b7291a4
 | 
			
		||||
        type: string
 | 
			
		||||
      id:
 | 
			
		||||
        example: 1000015
 | 
			
		||||
        type: integer
 | 
			
		||||
      quiz_paper_id:
 | 
			
		||||
        example: 1000001
 | 
			
		||||
        type: integer
 | 
			
		||||
      start_at:
 | 
			
		||||
        type: string
 | 
			
		||||
      status:
 | 
			
		||||
        example: wating
 | 
			
		||||
        type: string
 | 
			
		||||
      total_score:
 | 
			
		||||
        example: 100
 | 
			
		||||
        type: number
 | 
			
		||||
      user_id:
 | 
			
		||||
        example: 1000002
 | 
			
		||||
        type: integer
 | 
			
		||||
      user_score:
 | 
			
		||||
        example: 5
 | 
			
		||||
        type: number
 | 
			
		||||
    type: object
 | 
			
		||||
  learnsteam_cslms-api_internal_models.PaperListResponse:
 | 
			
		||||
    properties:
 | 
			
		||||
      data:
 | 
			
		||||
        items:
 | 
			
		||||
          $ref: '#/definitions/learnsteam_cslms-api_internal_models.PaperResponse'
 | 
			
		||||
        type: array
 | 
			
		||||
      page:
 | 
			
		||||
        example: 1
 | 
			
		||||
        type: integer
 | 
			
		||||
      pageSize:
 | 
			
		||||
        example: 10
 | 
			
		||||
        type: integer
 | 
			
		||||
      total:
 | 
			
		||||
        example: 999
 | 
			
		||||
        type: integer
 | 
			
		||||
      totalPage:
 | 
			
		||||
        example: 99
 | 
			
		||||
        type: integer
 | 
			
		||||
    type: object
 | 
			
		||||
  learnsteam_cslms-api_internal_models.PaperResponse:
 | 
			
		||||
    properties:
 | 
			
		||||
      category:
 | 
			
		||||
        example: 파이썬기본
 | 
			
		||||
        type: string
 | 
			
		||||
      center_id:
 | 
			
		||||
        example: 1000015
 | 
			
		||||
        type: integer
 | 
			
		||||
      created_at:
 | 
			
		||||
        type: string
 | 
			
		||||
      done_at:
 | 
			
		||||
        type: string
 | 
			
		||||
      first_name:
 | 
			
		||||
        example: 길순
 | 
			
		||||
        type: string
 | 
			
		||||
      guid_id:
 | 
			
		||||
        example: 7f9329f5-2e36-4638-92d2-73064b7291a4
 | 
			
		||||
        type: string
 | 
			
		||||
      id:
 | 
			
		||||
        example: 1000015
 | 
			
		||||
        type: integer
 | 
			
		||||
      last_name:
 | 
			
		||||
        example: 홍
 | 
			
		||||
        type: string
 | 
			
		||||
      quiz_paper_id:
 | 
			
		||||
        example: 1000001
 | 
			
		||||
        type: integer
 | 
			
		||||
      start_at:
 | 
			
		||||
        type: string
 | 
			
		||||
      status:
 | 
			
		||||
        example: wating
 | 
			
		||||
        type: string
 | 
			
		||||
      title:
 | 
			
		||||
        example: 출력 Print
 | 
			
		||||
        type: string
 | 
			
		||||
      total_score:
 | 
			
		||||
        example: 100
 | 
			
		||||
        type: number
 | 
			
		||||
      user_id:
 | 
			
		||||
        example: 1000002
 | 
			
		||||
        type: integer
 | 
			
		||||
      user_score:
 | 
			
		||||
        example: 5
 | 
			
		||||
        type: number
 | 
			
		||||
    type: object
 | 
			
		||||
  learnsteam_cslms-api_internal_models.Quiz:
 | 
			
		||||
    properties:
 | 
			
		||||
      answer:
 | 
			
		||||
@@ -886,6 +991,194 @@ paths:
 | 
			
		||||
      summary: 센터 수정
 | 
			
		||||
      tags:
 | 
			
		||||
      - 센터
 | 
			
		||||
  /paper:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 목록을 가져옵니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: 검색어
 | 
			
		||||
        in: query
 | 
			
		||||
        name: q
 | 
			
		||||
        type: string
 | 
			
		||||
      - description: 페이지
 | 
			
		||||
        in: query
 | 
			
		||||
        name: page
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: 페이지 사이즈
 | 
			
		||||
        in: query
 | 
			
		||||
        name: limit
 | 
			
		||||
        type: integer
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.PaperListResponse'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 목록 가져오기
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: ID로 페이퍼 정보를 가져옵니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Paper ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.PaperResponse'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 페이퍼 정보 가져오기
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}/finish:
 | 
			
		||||
    patch:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 퀴즈 종료합니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Paper ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.Paper'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 퀴즈 종료
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}/quiz:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 퀴즈페이퍼 퀴즈 목록을 가져옵니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: 퀴즈페이퍼 ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: 페이지
 | 
			
		||||
        in: query
 | 
			
		||||
        name: page
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: 페이지 사이즈
 | 
			
		||||
        in: query
 | 
			
		||||
        name: limit
 | 
			
		||||
        type: integer
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.UserQuizListResponse'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 퀴즈페이퍼 퀴즈 목록 가져오기
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}/quiz/{quiz_id}:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: ID로 퀴즈를 가져옵니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Paper ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      - description: 사용자퀴즈 ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: quiz_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.UserQuizResponse'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 퀴즈페이퍼 퀴즈 가져오기
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}/quiz/{quiz_id}/answer:
 | 
			
		||||
    patch:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 퀴즈 답변을 제출합니다..
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Paper ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: Quiz ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: quiz_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: Answer Body
 | 
			
		||||
        in: body
 | 
			
		||||
        name: quizBody
 | 
			
		||||
        required: true
 | 
			
		||||
        schema:
 | 
			
		||||
          $ref: '#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest'
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses: {}
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 퀴즈 답변
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /paper/{paper_id}/start:
 | 
			
		||||
    patch:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 퀴즈 시작합니다.
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Paper ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: paper_id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses:
 | 
			
		||||
        "200":
 | 
			
		||||
          description: OK
 | 
			
		||||
          schema:
 | 
			
		||||
            $ref: '#/definitions/learnsteam_cslms-api_internal_models.Paper'
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 퀴즈 시작
 | 
			
		||||
      tags:
 | 
			
		||||
      - 페이퍼
 | 
			
		||||
  /quiz:
 | 
			
		||||
    get:
 | 
			
		||||
      consumes:
 | 
			
		||||
@@ -1306,6 +1599,30 @@ paths:
 | 
			
		||||
      summary: 사용자퀴즈 가져오기
 | 
			
		||||
      tags:
 | 
			
		||||
      - 사용자퀴즈
 | 
			
		||||
    patch:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
      description: 사용자퀴즈 답변을 제출합니다..
 | 
			
		||||
      parameters:
 | 
			
		||||
      - description: Quiz ID
 | 
			
		||||
        in: path
 | 
			
		||||
        name: id
 | 
			
		||||
        required: true
 | 
			
		||||
        type: integer
 | 
			
		||||
      - description: Answer Body
 | 
			
		||||
        in: body
 | 
			
		||||
        name: quizBody
 | 
			
		||||
        required: true
 | 
			
		||||
        schema:
 | 
			
		||||
          $ref: '#/definitions/learnsteam_cslms-api_internal_models.AnswerQuizRequest'
 | 
			
		||||
      produces:
 | 
			
		||||
      - application/json
 | 
			
		||||
      responses: {}
 | 
			
		||||
      security:
 | 
			
		||||
      - Bearer: []
 | 
			
		||||
      summary: 사용자퀴즈 답변
 | 
			
		||||
      tags:
 | 
			
		||||
      - 사용자퀴즈
 | 
			
		||||
    put:
 | 
			
		||||
      consumes:
 | 
			
		||||
      - application/json
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							@@ -1,15 +1,17 @@
 | 
			
		||||
module learnsteam/cslms-api
 | 
			
		||||
 | 
			
		||||
go 1.21
 | 
			
		||||
go 1.22
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/apex/gateway v1.1.2
 | 
			
		||||
	github.com/gin-contrib/cors v1.4.0
 | 
			
		||||
	github.com/golang-jwt/jwt/v5 v5.1.0
 | 
			
		||||
	github.com/google/go-cmp v0.6.0
 | 
			
		||||
	github.com/google/uuid v1.4.0
 | 
			
		||||
	github.com/stretchr/testify v1.8.4
 | 
			
		||||
	github.com/swaggo/files v1.0.1
 | 
			
		||||
	github.com/swaggo/gin-swagger v1.6.0
 | 
			
		||||
	github.com/swaggo/swag v1.16.2
 | 
			
		||||
	golang.org/x/crypto v0.15.0
 | 
			
		||||
	gorm.io/datatypes v1.2.0
 | 
			
		||||
	gorm.io/driver/mysql v1.5.2
 | 
			
		||||
@@ -34,7 +36,6 @@ require (
 | 
			
		||||
	github.com/go-playground/validator/v10 v10.16.0 // indirect
 | 
			
		||||
	github.com/go-sql-driver/mysql v1.7.0 // indirect
 | 
			
		||||
	github.com/goccy/go-json v0.10.2 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.5.9 // indirect
 | 
			
		||||
	github.com/jinzhu/inflection v1.0.0 // indirect
 | 
			
		||||
	github.com/jinzhu/now v1.1.5 // indirect
 | 
			
		||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
			
		||||
@@ -48,7 +49,6 @@ require (
 | 
			
		||||
	github.com/modern-go/reflect2 v1.0.2 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/swaggo/swag v1.16.2 // indirect
 | 
			
		||||
	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 | 
			
		||||
	github.com/ugorji/go/codec v1.2.11 // indirect
 | 
			
		||||
	golang.org/x/arch v0.6.0 // indirect
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@@ -72,8 +72,8 @@ github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei
 | 
			
		||||
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
 | 
			
		||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
 | 
			
		||||
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										426
									
								
								internal/controllers/paper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								internal/controllers/paper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,426 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
	"gorm.io/datatypes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PaperController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Start(*gin.Context)
 | 
			
		||||
	Finish(*gin.Context)
 | 
			
		||||
 | 
			
		||||
	QuizList(*gin.Context)
 | 
			
		||||
	QuizFind(*gin.Context)
 | 
			
		||||
	QuizAnswer(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type paperController struct {
 | 
			
		||||
	service          services.PaperService
 | 
			
		||||
	paperQuizService services.PaperQuizService
 | 
			
		||||
	userService      services.UserService
 | 
			
		||||
	quizService      services.QuizService
 | 
			
		||||
	quizPaperService services.QuizPaperService
 | 
			
		||||
	userQuizService  services.UserQuizService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperController(
 | 
			
		||||
	service services.PaperService,
 | 
			
		||||
	paperQuizService services.PaperQuizService,
 | 
			
		||||
	quizService services.QuizService,
 | 
			
		||||
	quizPaperService services.QuizPaperService,
 | 
			
		||||
	userService services.UserService,
 | 
			
		||||
	userQuizServie services.UserQuizService,
 | 
			
		||||
) PaperController {
 | 
			
		||||
	return &paperController{
 | 
			
		||||
		service:          service,
 | 
			
		||||
		paperQuizService: paperQuizService,
 | 
			
		||||
		userService:      userService,
 | 
			
		||||
		quizService:      quizService,
 | 
			
		||||
		quizPaperService: quizPaperService,
 | 
			
		||||
		userQuizService:  userQuizServie,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Paper List
 | 
			
		||||
//
 | 
			
		||||
// @Summary			목록 가져오기
 | 
			
		||||
// @Description	목록을 가져옵니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param q query string false "검색어"
 | 
			
		||||
// @Param page query int false "페이지"
 | 
			
		||||
// @Param limit query int false "페이지 사이즈"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.PaperListResponse
 | 
			
		||||
// @Router /paper  [get]
 | 
			
		||||
func (controller *paperController) List(c *gin.Context) {
 | 
			
		||||
	q := c.DefaultQuery("q", "")
 | 
			
		||||
	page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	limit, err := strconv.Atoi(c.DefaultQuery("limit", "10"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
	result, err := controller.service.List(user_id, q, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.service.Total(user_id, q)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	response := models.PaperListResponse{
 | 
			
		||||
		Data:      *result,
 | 
			
		||||
		Total:     totalNumber,
 | 
			
		||||
		Page:      page,
 | 
			
		||||
		TotalPage: totalPage,
 | 
			
		||||
		PageSize:  limit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get paper
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		페이퍼 정보 가져오기
 | 
			
		||||
// @Description	ID로 페이퍼 정보를 가져옵니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path int64 true "Paper ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.PaperResponse
 | 
			
		||||
// @Router /paper/{paper_id} [get]
 | 
			
		||||
func (controller *paperController) Find(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Find(paper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start Paper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			퀴즈 시작
 | 
			
		||||
// @Description 퀴즈 시작합니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path int64 true "Paper ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.Paper
 | 
			
		||||
// @Router /paper/{paper_id}/start [patch]
 | 
			
		||||
func (controller *paperController) Start(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	paper, err := controller.service.Get(paper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if paper.Status != "ready" {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈를 시작할 수 없습니다."})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	paper.Status = "start"
 | 
			
		||||
	paper.StartAt = &now
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(paper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Finish Paper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			퀴즈 종료
 | 
			
		||||
// @Description 퀴즈 종료합니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path int64 true "Paper ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.Paper
 | 
			
		||||
// @Router /paper/{paper_id}/finish [patch]
 | 
			
		||||
func (controller *paperController) Finish(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	paper, err := controller.service.Get(paper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if paper.Status != "start" {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈를 종료할 수 없습니다."})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	paper.Status = "finish"
 | 
			
		||||
	paper.DoneAt = &now
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(paper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Quiz List
 | 
			
		||||
//
 | 
			
		||||
// @Summary     퀴즈페이퍼 퀴즈 목록 가져오기
 | 
			
		||||
// @Description 퀴즈페이퍼 퀴즈 목록을 가져옵니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path int64 true "퀴즈페이퍼 ID"
 | 
			
		||||
// @Param page query int false "페이지"
 | 
			
		||||
// @Param limit query int false "페이지 사이즈"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.UserQuizListResponse
 | 
			
		||||
// @Router /paper/{paper_id}/quiz  [get]
 | 
			
		||||
func (controller *paperController) QuizList(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : page")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	limit, err := strconv.Atoi(c.DefaultQuery("limit", "10"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : limit")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.paperQuizService.List(paper_id, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.paperQuizService.Total(paper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"data": result, "total": totalNumber, "page": page, "totalPage": totalPage, "pageSize": limit})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get Quiz
 | 
			
		||||
//
 | 
			
		||||
// @Summary     퀴즈페이퍼 퀴즈 가져오기
 | 
			
		||||
// @Description ID로 퀴즈를 가져옵니다.
 | 
			
		||||
// @Tags        페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path string true "Paper ID"
 | 
			
		||||
// @Param quiz_id path string true "사용자퀴즈 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.UserQuizResponse
 | 
			
		||||
// @Router /paper/{paper_id}/quiz/{quiz_id} [get]
 | 
			
		||||
func (controller *paperController) QuizFind(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz_id, err := strconv.ParseInt(c.Param("quiz_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.paperQuizService.Find(quiz_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if paper_id != result.UserQuizPaperID {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈시트와 퀴즈가 일치하지 않습니다."})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Answer Quiz
 | 
			
		||||
//
 | 
			
		||||
// @Summary 퀴즈 답변
 | 
			
		||||
// @Description 퀴즈 답변을 제출합니다..
 | 
			
		||||
// @Tags    페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param paper_id path int64 true "Paper ID"
 | 
			
		||||
// @Param quiz_id path int64 true "Quiz ID"
 | 
			
		||||
// @Param quizBody body models.AnswerQuizRequest true "Answer Body"
 | 
			
		||||
//
 | 
			
		||||
// @Router /paper/{paper_id}/quiz/{quiz_id}/answer [patch]
 | 
			
		||||
func (controller *paperController) QuizAnswer(c *gin.Context) {
 | 
			
		||||
	paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	id, err := strconv.ParseInt(c.Param("quiz_id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var request models.AnswerQuizRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquiz, err := controller.userQuizService.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if paper_id != userquiz.UserQuizPaperID {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈시트와 퀴즈가 일치하지 않습니다."})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
	if user_id != userquiz.UserID {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if userquiz.Status != "ready" {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "Answered"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz, err := controller.quizService.Find(userquiz.QuizID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var userAnswer datatypes.JSON
 | 
			
		||||
	userAnswer, err = json.Marshal(request.Answer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isCorrect := cmp.Equal(quiz.Answer.String(), userAnswer.String())
 | 
			
		||||
	var score float32 = 0.0
 | 
			
		||||
	var correction string = "wrong"
 | 
			
		||||
	if isCorrect {
 | 
			
		||||
		score = 1.0
 | 
			
		||||
		correction = "correct"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquiz.Answer = userAnswer
 | 
			
		||||
	userquiz.Status = "answer"
 | 
			
		||||
	userquiz.Result = correction
 | 
			
		||||
	userquiz.Score = score
 | 
			
		||||
 | 
			
		||||
	_, err = controller.userQuizService.Update(userquiz)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = controller.service.UpdateScore(userquiz.UserQuizPaperID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"message": "success"})
 | 
			
		||||
}
 | 
			
		||||
@@ -11,6 +11,7 @@ import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
	"github.com/google/uuid"
 | 
			
		||||
	"gorm.io/datatypes"
 | 
			
		||||
)
 | 
			
		||||
@@ -20,15 +21,20 @@ type UserQuizController interface {
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Create(*gin.Context)
 | 
			
		||||
	Update(*gin.Context)
 | 
			
		||||
	Answer(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type userQuizController struct {
 | 
			
		||||
	service services.UserQuizService
 | 
			
		||||
	service              services.UserQuizService
 | 
			
		||||
	quizService          services.QuizService
 | 
			
		||||
	userquizpaperService services.UserQuizPaperService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserQuizController(service services.UserQuizService) UserQuizController {
 | 
			
		||||
func NewUserQuizController(service services.UserQuizService, quizService services.QuizService, userquizpaperService services.UserQuizPaperService) UserQuizController {
 | 
			
		||||
	return &userQuizController{
 | 
			
		||||
		service: service,
 | 
			
		||||
		service:              service,
 | 
			
		||||
		quizService:          quizService,
 | 
			
		||||
		userquizpaperService: userquizpaperService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -154,7 +160,7 @@ func (controller *userQuizController) Create(c *gin.Context) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz := &models.UserQuiz{
 | 
			
		||||
	userquiz := &models.UserQuiz{
 | 
			
		||||
		GUID:            uuid.NewString(),
 | 
			
		||||
		CenterID:        request.CenterID,
 | 
			
		||||
		UserQuizPaperID: request.UserQuizPaperID,
 | 
			
		||||
@@ -168,7 +174,7 @@ func (controller *userQuizController) Create(c *gin.Context) {
 | 
			
		||||
		CreatedAt:       time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Create(quiz)
 | 
			
		||||
	result, err := controller.service.Create(userquiz)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
@@ -212,18 +218,6 @@ func (controller *userQuizController) Update(c *gin.Context) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 	CenterID        int64          `json:"center_id" example:"1000001"`
 | 
			
		||||
	// UserQuizPaperID int64          `json:"quiz_paper_id" example:"1000001"`
 | 
			
		||||
	// UserID          int64          `json:"user_id" example:"1000001"`
 | 
			
		||||
	// No              int            `json:"vol_no" example:"1"`
 | 
			
		||||
	// QuestionType    string         `json:"question_type" example:"choice"`
 | 
			
		||||
	// Question        string         `json:"question" example:"질문입니다."`
 | 
			
		||||
	// Content         datatypes.JSON `json:"content"`
 | 
			
		||||
	// Answer          datatypes.JSON `json:"answer"`
 | 
			
		||||
	// Status          string         `json:"status" example:"waiting"`
 | 
			
		||||
	// Result          string         `json:"result" example:"success"`
 | 
			
		||||
	// Score           float32        `json:"score" example:"10"`
 | 
			
		||||
 | 
			
		||||
	var content datatypes.JSON
 | 
			
		||||
	content, err = json.Marshal(request.Content)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -256,3 +250,91 @@ func (controller *userQuizController) Update(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Answer Quiz
 | 
			
		||||
//
 | 
			
		||||
// @Summary 사용자퀴즈 답변
 | 
			
		||||
// @Description 사용자퀴즈 답변을 제출합니다..
 | 
			
		||||
// @Tags    사용자퀴즈
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path int64 true "Quiz ID"
 | 
			
		||||
// @Param quizBody body models.AnswerQuizRequest true "Answer Body"
 | 
			
		||||
//
 | 
			
		||||
// @Router /userquiz/{id} [patch]
 | 
			
		||||
func (controller *userQuizController) Answer(c *gin.Context) {
 | 
			
		||||
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var request models.AnswerQuizRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquiz, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
	if user_id != userquiz.UserID {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if userquiz.Status != "ready" {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "Answered"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz, err := controller.quizService.Find(userquiz.QuizID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var userAnswer datatypes.JSON
 | 
			
		||||
	userAnswer, err = json.Marshal(request.Answer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isCorrect := cmp.Equal(quiz.Answer.String(), userAnswer.String())
 | 
			
		||||
	var score float32 = 0.0
 | 
			
		||||
	var correction string = "wrong"
 | 
			
		||||
	if isCorrect {
 | 
			
		||||
		score = 1.0
 | 
			
		||||
		correction = "correct"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquiz.Answer = userAnswer
 | 
			
		||||
	userquiz.Status = "answer"
 | 
			
		||||
	userquiz.Result = correction
 | 
			
		||||
	userquiz.Score = score
 | 
			
		||||
 | 
			
		||||
	_, err = controller.service.Update(userquiz)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = controller.userquizpaperService.UpdateScore(userquiz.UserQuizPaperID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// fmt.Println("userscore : ", result.UserScore)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"message": "success"})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								internal/models/paper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								internal/models/paper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Paper struct {
 | 
			
		||||
	ID          int64      `json:"id" db:"id" example:"1000015" gorm:"column:id;primary_key;"`
 | 
			
		||||
	GUID        string     `json:"guid_id" db:"guid_id" example:"7f9329f5-2e36-4638-92d2-73064b7291a4" gorm:"column:guid_id;size:255;uniqueIndex"`
 | 
			
		||||
	CenterID    int64      `json:"center_id" db:"center_id" example:"1000015" gorm:"column:center_id;index;"`
 | 
			
		||||
	QuizPaperID int64      `json:"quiz_paper_id" db:"quiz_paper_id" example:"1000001" gorm:"column:quiz_paper_id;index;"`
 | 
			
		||||
	UserID      int64      `json:"user_id" db:"user_id" example:"1000002" gorm:"column:user_id;index;"`
 | 
			
		||||
	UserScore   float32    `json:"user_score" db:"user_score" example:"5" gorm:"column:user_score;"`
 | 
			
		||||
	TotalScore  float32    `json:"total_score" db:"total_score" example:"100" gorm:"column:total_score;"`
 | 
			
		||||
	Status      string     `json:"status" example:"wating" gorm:"column:status;size:10;index;"`
 | 
			
		||||
	StartAt     *time.Time `json:"start_at" gorm:"column:start_at;index;"`
 | 
			
		||||
	DoneAt      *time.Time `json:"done_at" gorm:"column:done_at;index;"`
 | 
			
		||||
	UpdatedAt   time.Time  `json:"-" gorm:"column:updated_at;type:DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;index;->:false"`
 | 
			
		||||
	CreatedAt   time.Time  `json:"-" gorm:"column:created_at;type:DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;index;->:false;<-:create"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 테이블이름 정의
 | 
			
		||||
func (Paper) TableName() string {
 | 
			
		||||
	return "UserQuizPapers"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperResponse struct {
 | 
			
		||||
	ID          int64      `json:"id" db:"id" example:"1000015"`
 | 
			
		||||
	GUID        string     `json:"guid_id" db:"guid_id" example:"7f9329f5-2e36-4638-92d2-73064b7291a4"`
 | 
			
		||||
	CenterID    int64      `json:"center_id" db:"center_id" example:"1000015"`
 | 
			
		||||
	QuizPaperID int64      `json:"quiz_paper_id" db:"quiz_paper_id" example:"1000001"`
 | 
			
		||||
	UserID      int64      `json:"user_id" db:"user_id" example:"1000002"`
 | 
			
		||||
	FirstName   string     `json:"first_name" db:"first_name" example:"길순"`
 | 
			
		||||
	LastName    string     `json:"last_name" db:"last_name" example:"홍"`
 | 
			
		||||
	UserScore   float32    `json:"user_score" db:"user_score" example:"5"`
 | 
			
		||||
	TotalScore  float32    `json:"total_score" db:"total_score" example:"100"`
 | 
			
		||||
	Status      string     `json:"status" example:"wating"`
 | 
			
		||||
	Category    string     `json:"category" example:"파이썬기본"`
 | 
			
		||||
	Title       string     `json:"title" example:"출력 Print"`
 | 
			
		||||
	StartAt     *time.Time `json:"start_at"`
 | 
			
		||||
	DoneAt      *time.Time `json:"done_at"`
 | 
			
		||||
	CreatedAt   *time.Time `json:"created_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperPatchRequest struct {
 | 
			
		||||
	UserScore  float32 `json:"user_score" example:"4"`
 | 
			
		||||
	TotalScore float32 `json:"total_score" example:"80"`
 | 
			
		||||
	Status     string  `json:"status" example:"ready"`
 | 
			
		||||
	StartAt    string  `json:"start_at,omitempty" example:"2023-11-10T13:10:00+09:00"`
 | 
			
		||||
	DoneAt     string  `json:"done_at,omitempty" example:"2023-11-10T13:25:00+09:00"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperListResponse struct {
 | 
			
		||||
	Data      []PaperResponse `json:"data"`
 | 
			
		||||
	Total     int64           `json:"total" example:"999"`
 | 
			
		||||
	Page      int             `json:"page" example:"1"`
 | 
			
		||||
	TotalPage int64           `json:"totalPage" example:"99"`
 | 
			
		||||
	PageSize  int             `json:"pageSize" example:"10"`
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								internal/models/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								internal/models/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"gorm.io/datatypes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PaperQuiz struct {
 | 
			
		||||
	ID              int64          `json:"id" db:"id" example:"1000001" gorm:"column:id;primary_key;"`
 | 
			
		||||
	GUID            string         `json:"guid_id" db:"guid_id" example:"2036023a-fb56-4b6c-b3bb-c787c681ada6" gorm:"column:guid_id;size:255;index;"`
 | 
			
		||||
	CenterID        int64          `json:"center_id" db:"center_id" example:"100001" gorm:"column:center_id;index;"`
 | 
			
		||||
	UserQuizPaperID int64          `json:"user_quiz_paper_id" db:"user_quiz_paper_id" example:"1000001" gorm:"column:user_quiz_paper_id;index;"`
 | 
			
		||||
	UserID          int64          `json:"user_id" db:"user_id" example:"1000001" gorm:"column:user_id;index;"`
 | 
			
		||||
	QuizID          int64          `json:"quiz_id" db:"quiz_id" example:"1000001" gorm:"column:quiz_id;index;"`
 | 
			
		||||
	No              int            `json:"vol_no" db:"vol_no" example:"5" gorm:"column:vol_no;index;"`
 | 
			
		||||
	QuestionType    string         `json:"question_type" db:"question_type" example:"choice" gorm:"column:question_type;size:10;index;"`
 | 
			
		||||
	Question        string         `json:"question" db:"question" example:"퀴즈 질문입니다." gorm:"column:question;size:512;"`
 | 
			
		||||
	Content         datatypes.JSON `json:"content" db:"content" gorm:"column:content;"`
 | 
			
		||||
	Status          string         `json:"status" db:"status" example:"waiting" gorm:"column:status;size:10;index;"`
 | 
			
		||||
	Result          string         `json:"result" db:"result" example:"success" gorm:"column:result;size:10;index;"`
 | 
			
		||||
	Score           float32        `json:"score" db:"score" example:"10" gorm:"column:score;"`
 | 
			
		||||
	UpdatedAt       time.Time      `json:"-" gorm:"column:updated_at;type:DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;index;->:false"`
 | 
			
		||||
	CreatedAt       time.Time      `json:"-" gorm:"column:created_at;type:DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;index;->:false;<-:create"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 테이블이름 정의
 | 
			
		||||
func (PaperQuiz) TableName() string {
 | 
			
		||||
	return "UserQuizs"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperQuizResponse struct {
 | 
			
		||||
	ID              int64       `json:"id" example:"1000001"`
 | 
			
		||||
	GUID            string      `json:"guid_id" example:"2036023a-fb56-4b6c-b3bb-c787c681ada6"`
 | 
			
		||||
	CenterD         string      `json:"center_id" example:"2036023a-fb56-4b6c-b3bb-c787c681ada6"`
 | 
			
		||||
	UserQuizPaperID int64       `json:"user_quiz_paper_id" example:"1000001"`
 | 
			
		||||
	UserID          int64       `json:"user_id" example:"1000001"`
 | 
			
		||||
	QuizID          int64       `json:"quiz_id" example:"1000001"`
 | 
			
		||||
	No              int         `json:"vol_no" example:"5"`
 | 
			
		||||
	QuestionType    string      `json:"question_type" example:"check"`
 | 
			
		||||
	Question        string      `json:"question" example:"퀴즈 질문입니다."`
 | 
			
		||||
	Content         QuizContent `json:"content"`
 | 
			
		||||
	Status          string      `json:"status" example:"waiting"`
 | 
			
		||||
	Result          string      `json:"result" example:"success"`
 | 
			
		||||
	Score           float32     `json:"score" example:"10"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperQuizListResponse struct {
 | 
			
		||||
	Data      []UserQuizResponse `json:"data"`
 | 
			
		||||
	Total     int64              `json:"total" example:"5"`
 | 
			
		||||
	Page      int                `json:"page" example:"1"`
 | 
			
		||||
	TotalPage int64              `json:"totalPage" example:"1"`
 | 
			
		||||
	PageSize  int                `json:"pageSize" example:"10"`
 | 
			
		||||
}
 | 
			
		||||
@@ -69,3 +69,7 @@ type UserQuizListResponse struct {
 | 
			
		||||
	TotalPage int64              `json:"totalPage" example:"1"`
 | 
			
		||||
	PageSize  int                `json:"pageSize" example:"10"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AnswerQuizRequest struct {
 | 
			
		||||
	Answer []string `json:"answer" example:"option1,option4"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										101
									
								
								internal/repositories/paper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								internal/repositories/paper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
package repositories
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paperRepository struct {
 | 
			
		||||
	DB *gorm.DB
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperRepository(db *gorm.DB) PaperRepository {
 | 
			
		||||
	return &paperRepository{
 | 
			
		||||
		DB: db,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperRepository interface {
 | 
			
		||||
	List(int64, string, int, int) (*[]models.PaperResponse, error)
 | 
			
		||||
	Total(int64, string) (int64, error)
 | 
			
		||||
 | 
			
		||||
	Find(int64) (*models.PaperResponse, error)
 | 
			
		||||
	Get(int64) (*models.Paper, error)
 | 
			
		||||
	Update(*models.Paper) (*models.Paper, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRepository) List(user_id int64, q string, page int, limit int) (*[]models.PaperResponse, error) {
 | 
			
		||||
	var rows *[]models.PaperResponse
 | 
			
		||||
	var err error
 | 
			
		||||
	offset := limit * (page - 1)
 | 
			
		||||
	if q != "" {
 | 
			
		||||
		err = r.DB.Offset(offset).Limit(limit).Order("UserQuizPapers.created_at DESC").
 | 
			
		||||
			Table("UserQuizPapers").
 | 
			
		||||
			Select("UserQuizPapers.*", "Users.first_name", "Users.last_name", "QuizPapers.title", "QuizPapers.category").
 | 
			
		||||
			Joins("LEFT JOIN Users ON Users.id = UserQuizPapers.user_id").
 | 
			
		||||
			Joins("LEFT JOIN QuizPapers ON QuizPapers.id = UserQuizPapers.quiz_paper_id").
 | 
			
		||||
			Where("QuizPapers.title LIKE ? OR QuizPapers.category LIKE ? OR CONCAT(first_name, last_name) LIKE ?", "%"+q+"%", "%"+q+"%", "%"+q+"%").
 | 
			
		||||
			Where("UserQuizPapers.user_id = ?", user_id).
 | 
			
		||||
			Find(&rows).Error
 | 
			
		||||
	} else {
 | 
			
		||||
		err = r.DB.Offset(offset).Limit(limit).Order("UserQuizPapers.created_at DESC").
 | 
			
		||||
			Table("UserQuizPapers").
 | 
			
		||||
			Select("UserQuizPapers.*", "Users.first_name", "Users.last_name", "QuizPapers.title", "QuizPapers.category").
 | 
			
		||||
			Joins("LEFT JOIN Users ON Users.id = UserQuizPapers.user_id").
 | 
			
		||||
			Joins("LEFT JOIN QuizPapers ON QuizPapers.id = UserQuizPapers.quiz_paper_id").
 | 
			
		||||
			Where("UserQuizPapers.user_id = ?", user_id).
 | 
			
		||||
			Find(&rows).Error
 | 
			
		||||
	}
 | 
			
		||||
	return rows, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRepository) Total(user_id int64, q string) (int64, error) {
 | 
			
		||||
	var total int64
 | 
			
		||||
	var err error
 | 
			
		||||
	if q != "" {
 | 
			
		||||
		err = r.DB.Model(&models.Paper{}).
 | 
			
		||||
			Joins("LEFT JOIN Users ON Users.id = UserQuizPapers.user_id").
 | 
			
		||||
			Joins("LEFT JOIN QuizPapers ON QuizPapers.id = UserQuizPapers.quiz_paper_id").
 | 
			
		||||
			Where("QuizPapers.title LIKE ? OR QuizPapers.category LIKE ? OR CONCAT(first_name, last_name) LIKE ?", "%"+q+"%", "%"+q+"%", "%"+q+"%").
 | 
			
		||||
			Where("UserQuizPapers.user_id = ?", user_id).
 | 
			
		||||
			Count(&total).
 | 
			
		||||
			Error
 | 
			
		||||
	} else {
 | 
			
		||||
		err = r.DB.Model(&models.Paper{}).
 | 
			
		||||
			Where("user_id = ?", user_id).
 | 
			
		||||
			Count(&total).
 | 
			
		||||
			Error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return total, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRepository) Find(id int64) (*models.PaperResponse, error) {
 | 
			
		||||
	var row *models.PaperResponse
 | 
			
		||||
	err := r.DB.
 | 
			
		||||
		Table("UserQuizPapers").
 | 
			
		||||
		Select("UserQuizPapers.*", "Users.first_name", "Users.last_name", "QuizPapers.title", "QuizPapers.category").
 | 
			
		||||
		Joins("LEFT JOIN Users ON Users.id = UserQuizPapers.user_id").
 | 
			
		||||
		Joins("LEFT JOIN QuizPapers ON QuizPapers.id = UserQuizPapers.quiz_paper_id").
 | 
			
		||||
		Where("UserQuizPapers.id = ?", id).First(&row).Error
 | 
			
		||||
	return row, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRepository) Get(id int64) (*models.Paper, error) {
 | 
			
		||||
	var row *models.Paper
 | 
			
		||||
	if err := r.DB.Where("id=?", id).First(&row).Error; err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return row, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRepository) Update(paper *models.Paper) (*models.Paper, error) {
 | 
			
		||||
	var row *models.Paper
 | 
			
		||||
	if err := r.DB.Where("id=?", paper.ID).First(&row).Error; err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := r.DB.Model(&row).Select("*").Updates(&paper).Error
 | 
			
		||||
	return row, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										89
									
								
								internal/repositories/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								internal/repositories/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
package repositories
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paperQuizRepository struct {
 | 
			
		||||
	DB *gorm.DB
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperQuizRepository(db *gorm.DB) PaperQuizRepository {
 | 
			
		||||
	return &paperQuizRepository{
 | 
			
		||||
		DB: db,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperQuizRepository interface {
 | 
			
		||||
	List(int64, int, int) (*[]models.PaperQuiz, error)
 | 
			
		||||
	Total(int64) (int64, error)
 | 
			
		||||
 | 
			
		||||
	Find(int64) (*models.PaperQuiz, error)
 | 
			
		||||
	Update(*models.PaperQuiz) (*models.PaperQuiz, error)
 | 
			
		||||
	Delete(int64) error
 | 
			
		||||
	SumScore(int64) (float32, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) List(paper_id int64, page int, limit int) (*[]models.PaperQuiz, error) {
 | 
			
		||||
	var rows *[]models.PaperQuiz
 | 
			
		||||
	var err error
 | 
			
		||||
	offset := limit * (page - 1)
 | 
			
		||||
	if paper_id > 0 {
 | 
			
		||||
		err = r.DB.Offset(offset).Limit(limit).Order("vol_no ASC").Where("user_quiz_paper_id = ?", paper_id).Find(&rows).Error
 | 
			
		||||
	} else {
 | 
			
		||||
		err = r.DB.Offset(offset).Limit(limit).Find(&rows).Error
 | 
			
		||||
	}
 | 
			
		||||
	return rows, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) Total(paper_id int64) (int64, error) {
 | 
			
		||||
	var total int64
 | 
			
		||||
	var err error
 | 
			
		||||
	if paper_id > 0 {
 | 
			
		||||
		err = r.DB.Model(&models.PaperQuiz{}).Where("user_quiz_paper_id = ?", paper_id).Count(&total).Error
 | 
			
		||||
	} else {
 | 
			
		||||
		err = r.DB.Model(&models.PaperQuiz{}).Count(&total).Error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return total, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) Find(id int64) (*models.PaperQuiz, error) {
 | 
			
		||||
	var row *models.PaperQuiz
 | 
			
		||||
	err := r.DB.Where("id = ?", id).First(&row).Error
 | 
			
		||||
	return row, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) Update(quiz *models.PaperQuiz) (*models.PaperQuiz, error) {
 | 
			
		||||
	var row *models.PaperQuiz
 | 
			
		||||
	if err := r.DB.Where("id=?", quiz.ID).First(&row).Error; err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := r.DB.Model(&row).Select("*").Updates(&quiz).Error
 | 
			
		||||
	return row, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) Delete(id int64) error {
 | 
			
		||||
	var row *models.PaperQuiz
 | 
			
		||||
	if err := r.DB.Where("id=?", id).First(&row).Error; err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err := r.DB.Delete(&row).Error
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperQuizRepository) SumScore(paper_id int64) (float32, error) {
 | 
			
		||||
	var result struct {
 | 
			
		||||
		Score float32
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := r.DB.Model(&models.PaperQuiz{}).Select("SUM(score) AS score").
 | 
			
		||||
		Where("user_quiz_paper_id = ?", paper_id).
 | 
			
		||||
		Scan(&result).Error; err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return result.Score, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -26,6 +26,7 @@ type UserQuizRepository interface {
 | 
			
		||||
	Insert([]models.UserQuiz) ([]models.UserQuiz, error)
 | 
			
		||||
	Update(*models.UserQuiz) (*models.UserQuiz, error)
 | 
			
		||||
	Delete(int64) error
 | 
			
		||||
	SumScore(int64) (float32, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *userQuizRepository) List(user_quiz_paper_id int64, page int, limit int) (*[]models.UserQuiz, error) {
 | 
			
		||||
@@ -86,3 +87,16 @@ func (r *userQuizRepository) Delete(id int64) error {
 | 
			
		||||
	err := r.DB.Delete(&row).Error
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *userQuizRepository) SumScore(userquizpaper_id int64) (float32, error) {
 | 
			
		||||
	var result struct {
 | 
			
		||||
		Score float32
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := r.DB.Model(&models.UserQuiz{}).Select("SUM(score) AS score").
 | 
			
		||||
		Where("user_quiz_paper_id = ?", userquizpaper_id).
 | 
			
		||||
		Scan(&result).Error; err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return result.Score, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										89
									
								
								internal/routers/paper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								internal/routers/paper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
package routers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/controllers"
 | 
			
		||||
	"learnsteam/cslms-api/internal/middleware"
 | 
			
		||||
	"learnsteam/cslms-api/internal/repositories"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func InitPaperRouter(db *gorm.DB, router *gin.Engine) {
 | 
			
		||||
	r := NewPaperRouter(db, router)
 | 
			
		||||
	r.SetPaperRouter()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperRouter interface {
 | 
			
		||||
	SetRouter(db *gorm.DB, router *gin.Engine)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type paperRouter struct {
 | 
			
		||||
	db                  *gorm.DB
 | 
			
		||||
	repository          repositories.PaperRepository
 | 
			
		||||
	paperQuizRepository repositories.PaperQuizRepository
 | 
			
		||||
	quizRepository      repositories.QuizRepository
 | 
			
		||||
	quizPaperRepository repositories.QuizPaperRepository
 | 
			
		||||
	userRepository      repositories.UserRepository
 | 
			
		||||
	userQuizRepository  repositories.UserQuizRepository
 | 
			
		||||
	service             services.PaperService
 | 
			
		||||
	paperQuizService    services.PaperQuizService
 | 
			
		||||
	quizService         services.QuizService
 | 
			
		||||
	quizPaperService    services.QuizPaperService
 | 
			
		||||
	userService         services.UserService
 | 
			
		||||
	userQuizService     services.UserQuizService
 | 
			
		||||
	controller          controllers.PaperController
 | 
			
		||||
	router              *gin.Engine
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperRouter(db *gorm.DB, router *gin.Engine) *paperRouter {
 | 
			
		||||
	repository := repositories.NewPaperRepository(db)
 | 
			
		||||
	paperQuizRepository := repositories.NewPaperQuizRepository(db)
 | 
			
		||||
	quizRepository := repositories.NewQuizRepository(db)
 | 
			
		||||
	quizPaperRepository := repositories.NewQuizPaperRepository(db)
 | 
			
		||||
	tokenRepository := repositories.NewTokenRepository(db)
 | 
			
		||||
	userRepository := repositories.NewUserRepository(db)
 | 
			
		||||
	userQuizRepository := repositories.NewUserQuizRepository(db)
 | 
			
		||||
 | 
			
		||||
	service := services.NewPaperService(repository, paperQuizRepository)
 | 
			
		||||
	paperQuizService := services.NewPaperQuizService(paperQuizRepository)
 | 
			
		||||
	quizService := services.NewQuizService(quizRepository)
 | 
			
		||||
	quizPaperService := services.NewQuizPaperService(quizPaperRepository)
 | 
			
		||||
	userService := services.NewUserService(userRepository, tokenRepository)
 | 
			
		||||
	userQuizService := services.NewUserQuizService(userQuizRepository, quizRepository)
 | 
			
		||||
 | 
			
		||||
	controller := controllers.NewPaperController(service, paperQuizService, quizService, quizPaperService, userService, userQuizService)
 | 
			
		||||
 | 
			
		||||
	return &paperRouter{
 | 
			
		||||
		db:                  db,
 | 
			
		||||
		repository:          repository,
 | 
			
		||||
		quizRepository:      quizRepository,
 | 
			
		||||
		quizPaperRepository: quizPaperRepository,
 | 
			
		||||
		userRepository:      userRepository,
 | 
			
		||||
		userQuizRepository:  userQuizRepository,
 | 
			
		||||
 | 
			
		||||
		service:          service,
 | 
			
		||||
		paperQuizService: paperQuizService,
 | 
			
		||||
		quizService:      quizService,
 | 
			
		||||
		quizPaperService: quizPaperService,
 | 
			
		||||
		userService:      userService,
 | 
			
		||||
		userQuizService:  userQuizService,
 | 
			
		||||
 | 
			
		||||
		controller: controller,
 | 
			
		||||
 | 
			
		||||
		router: router,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *paperRouter) SetPaperRouter() {
 | 
			
		||||
	group := r.router.Group("/paper")
 | 
			
		||||
	group.GET("", middleware.Auth("member"), r.controller.List)
 | 
			
		||||
	group.GET("/:paper_id", middleware.Auth("member"), r.controller.Find)
 | 
			
		||||
	group.PATCH("/:paper_id/start", middleware.Auth("member"), r.controller.Start)
 | 
			
		||||
	group.PATCH("/:paper_id/finish", middleware.Auth("member"), r.controller.Finish)
 | 
			
		||||
 | 
			
		||||
	group.GET("/:paper_id/quiz", middleware.Auth("member"), r.controller.QuizList)
 | 
			
		||||
	group.GET("/:paper_id/quiz/:quiz_id", middleware.Auth("member"), r.controller.QuizFind)
 | 
			
		||||
	group.PATCH("/:paper_id/quiz/:quiz_id/answer", middleware.Auth("member"), r.controller.QuizAnswer)
 | 
			
		||||
}
 | 
			
		||||
@@ -25,6 +25,7 @@ func Init() {
 | 
			
		||||
	InitAuthRouter(maindb, Router)
 | 
			
		||||
 | 
			
		||||
	InitCenterRouter(maindb, Router)
 | 
			
		||||
	InitPaperRouter(maindb, Router)
 | 
			
		||||
	InitQuizPaperRouter(maindb, Router)
 | 
			
		||||
	InitQuizRouter(maindb, Router)
 | 
			
		||||
	InitTokenRouter(maindb, Router)
 | 
			
		||||
 
 | 
			
		||||
@@ -20,27 +20,42 @@ type UserQuizRouter interface {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type userQuizRouter struct {
 | 
			
		||||
	db             *gorm.DB
 | 
			
		||||
	repository     repositories.UserQuizRepository
 | 
			
		||||
	quizRepository repositories.QuizRepository
 | 
			
		||||
	service        services.UserQuizService
 | 
			
		||||
	controller     controllers.UserQuizController
 | 
			
		||||
	router         *gin.Engine
 | 
			
		||||
	db                      *gorm.DB
 | 
			
		||||
	repository              repositories.UserQuizRepository
 | 
			
		||||
	quizRepository          repositories.QuizRepository
 | 
			
		||||
	userquizRepository      repositories.UserQuizRepository
 | 
			
		||||
	userquizpaperRepository repositories.UserQuizPaperRepository
 | 
			
		||||
	service                 services.UserQuizService
 | 
			
		||||
	quizService             services.QuizService
 | 
			
		||||
	userquizService         services.UserQuizService
 | 
			
		||||
	userquizpaperService    services.UserQuizPaperService
 | 
			
		||||
	controller              controllers.UserQuizController
 | 
			
		||||
	router                  *gin.Engine
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserQuizRouter(db *gorm.DB, router *gin.Engine) *userQuizRouter {
 | 
			
		||||
	repository := repositories.NewUserQuizRepository(db)
 | 
			
		||||
	quizRepostory := repositories.NewQuizRepository(db)
 | 
			
		||||
	userquizRepository := repositories.NewUserQuizRepository(db)
 | 
			
		||||
	userquizpaperRepository := repositories.NewUserQuizPaperRepository(db)
 | 
			
		||||
	service := services.NewUserQuizService(repository, quizRepostory)
 | 
			
		||||
	controller := controllers.NewUserQuizController(service)
 | 
			
		||||
	quizService := services.NewQuizService(quizRepostory)
 | 
			
		||||
	userquizService := services.NewUserQuizService(userquizRepository, quizRepostory)
 | 
			
		||||
	userquizpaperService := services.NewUserQuizPaperService(userquizpaperRepository, userquizRepository)
 | 
			
		||||
	controller := controllers.NewUserQuizController(service, quizService, userquizpaperService)
 | 
			
		||||
 | 
			
		||||
	return &userQuizRouter{
 | 
			
		||||
		db:             db,
 | 
			
		||||
		repository:     repository,
 | 
			
		||||
		quizRepository: quizRepostory,
 | 
			
		||||
		service:        service,
 | 
			
		||||
		controller:     controller,
 | 
			
		||||
		router:         router,
 | 
			
		||||
		db:                      db,
 | 
			
		||||
		repository:              repository,
 | 
			
		||||
		quizRepository:          quizRepostory,
 | 
			
		||||
		userquizpaperRepository: userquizpaperRepository,
 | 
			
		||||
		userquizRepository:      userquizRepository,
 | 
			
		||||
		service:                 service,
 | 
			
		||||
		quizService:             quizService,
 | 
			
		||||
		userquizpaperService:    userquizpaperService,
 | 
			
		||||
		userquizService:         userquizService,
 | 
			
		||||
		controller:              controller,
 | 
			
		||||
		router:                  router,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -50,4 +65,5 @@ func (r *userQuizRouter) SetUserQuizRouter() {
 | 
			
		||||
	group.GET("/:id", middleware.Auth("admin"), r.controller.Find)
 | 
			
		||||
	group.POST("", middleware.Auth("admin"), r.controller.Create)
 | 
			
		||||
	group.PUT("/:id", middleware.Auth("admin"), r.controller.Update)
 | 
			
		||||
	group.PATCH("/:id", middleware.Auth("member"), r.controller.Answer)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ func NewUserQuizPaperRouter(db *gorm.DB, router *gin.Engine) *userQuizPaperRoute
 | 
			
		||||
	userRepository := repositories.NewUserRepository(db)
 | 
			
		||||
	userQuizRepository := repositories.NewUserQuizRepository(db)
 | 
			
		||||
 | 
			
		||||
	service := services.NewUserQuizPaperService(repository)
 | 
			
		||||
	service := services.NewUserQuizPaperService(repository, userQuizRepository)
 | 
			
		||||
	quizService := services.NewQuizService(quizRepository)
 | 
			
		||||
	quizPaperService := services.NewQuizPaperService(quizPaperRepository)
 | 
			
		||||
	userService := services.NewUserService(userRepository, tokenRepository)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								internal/services/paper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								internal/services/paper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
package services
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/repositories"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paperService struct {
 | 
			
		||||
	repository          repositories.PaperRepository
 | 
			
		||||
	paperQuizRepository repositories.PaperQuizRepository
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperService interface {
 | 
			
		||||
	List(int64, string, int, int) (*[]models.PaperResponse, error)
 | 
			
		||||
	Total(int64, string) (int64, error)
 | 
			
		||||
 | 
			
		||||
	Find(int64) (*models.PaperResponse, error)
 | 
			
		||||
	Get(int64) (*models.Paper, error)
 | 
			
		||||
	Update(*models.Paper) (*models.Paper, error)
 | 
			
		||||
 | 
			
		||||
	UpdateScore(int64) (*models.Paper, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperService(repository repositories.PaperRepository, paperQuizRepository repositories.PaperQuizRepository) PaperService {
 | 
			
		||||
	return &paperService{
 | 
			
		||||
		repository:          repository,
 | 
			
		||||
		paperQuizRepository: paperQuizRepository,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) List(user_id int64, q string, page int, limit int) (*[]models.PaperResponse, error) {
 | 
			
		||||
	return s.repository.List(user_id, q, page, limit)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) Total(user_id int64, q string) (int64, error) {
 | 
			
		||||
	return s.repository.Total(user_id, q)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) Find(id int64) (*models.PaperResponse, error) {
 | 
			
		||||
	return s.repository.Find(id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) Get(id int64) (*models.Paper, error) {
 | 
			
		||||
	return s.repository.Get(id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) Update(paper *models.Paper) (*models.Paper, error) {
 | 
			
		||||
	result, err := s.repository.Update(paper)
 | 
			
		||||
 | 
			
		||||
	return result, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperService) UpdateScore(userquizpaper_id int64) (*models.Paper, error) {
 | 
			
		||||
	score, err := s.paperQuizRepository.SumScore(userquizpaper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquizpaper, err := s.repository.Get(userquizpaper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquizpaper.UserScore = score
 | 
			
		||||
	return s.repository.Update(userquizpaper)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								internal/services/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								internal/services/paperquiz.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
package services
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/repositories"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type paperQuizService struct {
 | 
			
		||||
	repository     repositories.PaperQuizRepository
 | 
			
		||||
	quizRepository repositories.QuizRepository
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PaperQuizService interface {
 | 
			
		||||
	List(int64, int, int) (*[]models.PaperQuiz, error)
 | 
			
		||||
	Total(int64) (int64, error)
 | 
			
		||||
 | 
			
		||||
	Find(int64) (*models.PaperQuiz, error)
 | 
			
		||||
	Update(*models.PaperQuiz) (*models.PaperQuiz, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPaperQuizService(repository repositories.PaperQuizRepository) PaperQuizService {
 | 
			
		||||
	return &paperQuizService{
 | 
			
		||||
		repository: repository,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperQuizService) List(user_quiz_paper_id int64, page int, limit int) (*[]models.PaperQuiz, error) {
 | 
			
		||||
	return s.repository.List(user_quiz_paper_id, page, limit)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperQuizService) Total(user_quiz_paper_id int64) (int64, error) {
 | 
			
		||||
	return s.repository.Total(user_quiz_paper_id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperQuizService) Find(id int64) (*models.PaperQuiz, error) {
 | 
			
		||||
	return s.repository.Find(id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *paperQuizService) Update(quiz *models.PaperQuiz) (*models.PaperQuiz, error) {
 | 
			
		||||
	result, err := s.repository.Update(quiz)
 | 
			
		||||
 | 
			
		||||
	return result, err
 | 
			
		||||
}
 | 
			
		||||
@@ -84,6 +84,7 @@ func (s *userQuizService) Generate(quiz_paper_id int64, userQuizPaper *models.Us
 | 
			
		||||
			QuestionType:    quiz.QuestionType,
 | 
			
		||||
			Question:        quiz.Question,
 | 
			
		||||
			Content:         quiz.Content,
 | 
			
		||||
			Status:          "ready",
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fmt.Println(userQuiz.Content)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package services
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/repositories"
 | 
			
		||||
 | 
			
		||||
@@ -8,7 +9,8 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type userQuizPaperService struct {
 | 
			
		||||
	repository repositories.UserQuizPaperRepository
 | 
			
		||||
	repository         repositories.UserQuizPaperRepository
 | 
			
		||||
	userquizRepository repositories.UserQuizRepository
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type UserQuizPaperService interface {
 | 
			
		||||
@@ -22,11 +24,13 @@ type UserQuizPaperService interface {
 | 
			
		||||
	Update(*models.UserQuizPaper) (*models.UserQuizPaper, error)
 | 
			
		||||
	Delete(string) error
 | 
			
		||||
	Generate([]int64, *models.QuizPaper) []models.UserQuizPaper
 | 
			
		||||
	UpdateScore(int64) (*models.UserQuizPaper, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserQuizPaperService(repository repositories.UserQuizPaperRepository) UserQuizPaperService {
 | 
			
		||||
func NewUserQuizPaperService(repository repositories.UserQuizPaperRepository, userquizRepository repositories.UserQuizRepository) UserQuizPaperService {
 | 
			
		||||
	return &userQuizPaperService{
 | 
			
		||||
		repository: repository,
 | 
			
		||||
		repository:         repository,
 | 
			
		||||
		userquizRepository: userquizRepository,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -79,6 +83,7 @@ func (s *userQuizPaperService) Generate(users []int64, quizPaper *models.QuizPap
 | 
			
		||||
			CenterID:    quizPaper.CenterID,
 | 
			
		||||
			UserID:      user_id,
 | 
			
		||||
			QuizPaperID: quizPaper.ID,
 | 
			
		||||
			Status:      "ready",
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		userQuizPapers = append(userQuizPapers, userQuizPaper)
 | 
			
		||||
@@ -86,3 +91,19 @@ func (s *userQuizPaperService) Generate(users []int64, quizPaper *models.QuizPap
 | 
			
		||||
 | 
			
		||||
	return userQuizPapers
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *userQuizPaperService) UpdateScore(userquizpaper_id int64) (*models.UserQuizPaper, error) {
 | 
			
		||||
	score, err := s.userquizRepository.SumScore(userquizpaper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userquizpaper, err := s.repository.Get(userquizpaper_id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("score", score)
 | 
			
		||||
	userquizpaper.UserScore = score
 | 
			
		||||
	return s.repository.Update(userquizpaper)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								test/test.db
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								test/test.db
									
									
									
									
									
										Normal file
									
								
							@@ -1,6 +1,7 @@
 | 
			
		||||
package learsteam_quiz_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	config "learnsteam/cslms-api/configs"
 | 
			
		||||
	"learnsteam/cslms-api/internal/controllers"
 | 
			
		||||
@@ -10,8 +11,10 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/golang-jwt/jwt/v5"
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
	"github.com/tj/assert"
 | 
			
		||||
	"gorm.io/datatypes"
 | 
			
		||||
	"gorm.io/driver/sqlite"
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
	"gorm.io/gorm/schema"
 | 
			
		||||
@@ -295,3 +298,24 @@ func (suite *TokenTestSuite) TestVerifyExpiredToken() {
 | 
			
		||||
	assert.Error(suite.T(), err)
 | 
			
		||||
	assert.False(suite.T(), jwtToken.Valid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *TokenTestSuite) TestCompareJSON() {
 | 
			
		||||
	// a := `["a","b","c"]`
 | 
			
		||||
	// b := `["a","b","c"]`
 | 
			
		||||
	a := `{"x":1,"y":2}`
 | 
			
		||||
	b := `{"y":2,"x":1}`
 | 
			
		||||
 | 
			
		||||
	var json1 datatypes.JSON
 | 
			
		||||
	json1, err := json.Marshal(a)
 | 
			
		||||
	assert.NoError(suite.T(), err)
 | 
			
		||||
 | 
			
		||||
	var json2 datatypes.JSON
 | 
			
		||||
	json2, err = json.Marshal(b)
 | 
			
		||||
	assert.NoError(suite.T(), err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(suite.T(), json2.String(), "")
 | 
			
		||||
 | 
			
		||||
	compare := cmp.Equal(json1.String(), json2.String())
 | 
			
		||||
 | 
			
		||||
	assert.Equal(suite.T(), true, compare)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user