Compare commits
3 Commits
0e71b28615
...
964785e494
| Author | SHA1 | Date | |
|---|---|---|---|
| 964785e494 | |||
| 9c67cd2a47 | |||
| 8b5cc8e939 |
33
docs/docs.go
33
docs/docs.go
@@ -1370,7 +1370,7 @@ const docTemplate = `{
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/handlers.VoteRequest"
|
||||
"$ref": "#/definitions/dto.VoteRequest"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -2018,6 +2018,22 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"dto.VoteRequest": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"up",
|
||||
"down",
|
||||
"none"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.APIInfo": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -2150,21 +2166,6 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.VoteRequest": {
|
||||
"description": "Vote request with type field. All votes are handled the same way.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"up",
|
||||
"down",
|
||||
"none"
|
||||
],
|
||||
"example": "up"
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.VoteResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -1367,7 +1367,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/handlers.VoteRequest"
|
||||
"$ref": "#/definitions/dto.VoteRequest"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -2015,6 +2015,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"dto.VoteRequest": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"up",
|
||||
"down",
|
||||
"none"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.APIInfo": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -2147,21 +2163,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.VoteRequest": {
|
||||
"description": "Vote request with type field. All votes are handled the same way.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"up",
|
||||
"down",
|
||||
"none"
|
||||
],
|
||||
"example": "up"
|
||||
}
|
||||
}
|
||||
},
|
||||
"handlers.VoteResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -140,6 +140,17 @@ definitions:
|
||||
required:
|
||||
- username
|
||||
type: object
|
||||
dto.VoteRequest:
|
||||
properties:
|
||||
type:
|
||||
enum:
|
||||
- up
|
||||
- down
|
||||
- none
|
||||
type: string
|
||||
required:
|
||||
- type
|
||||
type: object
|
||||
handlers.APIInfo:
|
||||
properties:
|
||||
data: {}
|
||||
@@ -230,17 +241,6 @@ definitions:
|
||||
success:
|
||||
type: boolean
|
||||
type: object
|
||||
handlers.VoteRequest:
|
||||
description: Vote request with type field. All votes are handled the same way.
|
||||
properties:
|
||||
type:
|
||||
enum:
|
||||
- up
|
||||
- down
|
||||
- none
|
||||
example: up
|
||||
type: string
|
||||
type: object
|
||||
handlers.VoteResponse:
|
||||
properties:
|
||||
data: {}
|
||||
@@ -1121,7 +1121,7 @@ paths:
|
||||
name: request
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/handlers.VoteRequest'
|
||||
$ref: '#/definitions/dto.VoteRequest'
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
|
||||
@@ -6,6 +6,10 @@ import (
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
type VoteRequest struct {
|
||||
Type string `json:"type" validate:"required,oneof=up down none"`
|
||||
}
|
||||
|
||||
type VoteDTO struct {
|
||||
ID uint `json:"id"`
|
||||
UserID *uint `json:"user_id,omitempty"`
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"net/http"
|
||||
|
||||
"goyco/internal/database"
|
||||
"goyco/internal/dto"
|
||||
"goyco/internal/services"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
@@ -39,11 +40,6 @@ func NewVoteHandler(voteService *services.VoteService) *VoteHandler {
|
||||
}
|
||||
}
|
||||
|
||||
// @Description Vote request with type field. All votes are handled the same way.
|
||||
type VoteRequest struct {
|
||||
Type string `json:"type" example:"up" enums:"up,down,none" description:"Vote type: 'up' for upvote, 'down' for downvote, 'none' to remove vote"`
|
||||
}
|
||||
|
||||
type VoteResponse = CommonResponse
|
||||
|
||||
// @Summary Cast a vote on a post
|
||||
@@ -62,7 +58,7 @@ type VoteResponse = CommonResponse
|
||||
// @Produce json
|
||||
// @Security BearerAuth
|
||||
// @Param id path int true "Post ID"
|
||||
// @Param request body VoteRequest true "Vote data (type: 'up', 'down', or 'none' to remove)"
|
||||
// @Param request body dto.VoteRequest true "Vote data (type: 'up', 'down', or 'none' to remove)"
|
||||
// @Success 200 {object} VoteResponse "Vote cast successfully with updated post statistics"
|
||||
// @Failure 401 {object} VoteResponse "Authentication required"
|
||||
// @Failure 400 {object} VoteResponse "Invalid request data or vote type"
|
||||
@@ -82,8 +78,9 @@ func (h *VoteHandler) CastVote(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
var req VoteRequest
|
||||
if !DecodeJSONRequest(w, r, &req) {
|
||||
req, ok := GetValidatedDTO[dto.VoteRequest](r)
|
||||
if !ok {
|
||||
SendErrorResponse(w, "Invalid request", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -286,7 +283,7 @@ func (h *VoteHandler) MountRoutes(r chi.Router, config RouteModuleConfig) {
|
||||
protected = config.GeneralRateLimit(protected)
|
||||
}
|
||||
|
||||
protected.Post("/posts/{id}/vote", h.CastVote)
|
||||
protected.Post("/posts/{id}/vote", WithValidation[dto.VoteRequest](config.ValidationMiddleware, h.CastVote))
|
||||
protected.Delete("/posts/{id}/vote", h.RemoveVote)
|
||||
protected.Get("/posts/{id}/vote", h.GetUserVote)
|
||||
protected.Get("/posts/{id}/votes", h.GetPostVotes)
|
||||
|
||||
Reference in New Issue
Block a user