This commit is contained in:
2025-11-12 09:41:52 +03:00
commit 2a8566712a
44 changed files with 2602 additions and 0 deletions

147
internal/server/project.go Normal file
View File

@@ -0,0 +1,147 @@
package server
import (
"errors"
"fmt"
"github.com/go-playground/validator/v10"
"github.com/goccy/go-json"
"madsky.ru/go-tracker/internal/model/project"
"madsky.ru/go-tracker/internal/model/user"
"madsky.ru/go-tracker/internal/server/request"
"madsky.ru/go-tracker/internal/server/response"
"net/http"
"strings"
)
func (app *Application) findProjects(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
u := ctx.Value(UserContext{}).(*user.User)
var filter project.FilterDTO
if u.Role != "admin" {
filter.UserID = &u.ID
}
isAdmin := u.Role == "admin"
p, err := app.Storage.Projects.Find(app.Ctx, u.ID, isAdmin, &filter)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, &p)
}
func (app *Application) findProjectByID(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
u := ctx.Value(UserContext{}).(*user.User)
projectId, err := request.Param(r, "id")
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
var filter project.FilterDTO
if u.Role != "admin" {
filter.UserID = &u.ID
}
isAdmin := u.Role == "admin"
p, err := app.Storage.Projects.FindOne(app.Ctx, projectId, u.ID, isAdmin)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, &p)
}
func (app *Application) createProject(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
u := ctx.Value(UserContext{}).(*user.User)
dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
var projectDto project.CreateProjectDTO
if err := dec.Decode(&projectDto); err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
validate = validator.New(validator.WithRequiredStructEnabled())
err := validate.Struct(projectDto)
if err != nil {
var validateErrs validator.ValidationErrors
errorsMessages := make([]string, 0)
if errors.As(err, &validateErrs) {
for _, e := range validateErrs {
errorsMessages = append(errorsMessages, fmt.Sprintf("%s is %s", e.Field(), e.Tag()))
}
}
response.Error(w, errors.New(strings.Join(errorsMessages, ",")), http.StatusBadRequest)
return
}
p, err := app.Storage.Projects.Create(app.Ctx, &projectDto)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
err = app.Storage.UserToProject.Create(app.Ctx, u.ID, p.ID)
if err != nil {
response.Error(w, err, http.StatusInternalServerError)
}
response.WriteJSON(w, nil, http.StatusCreated, &p)
}
func (app *Application) updateProject(w http.ResponseWriter, r *http.Request) {
id, err := request.Param(r, "id")
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
var projectDto project.UpdateProjectDTO
if err = dec.Decode(&projectDto); err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
p, err := app.Storage.Projects.Update(app.Ctx, id, &projectDto)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, &p)
}
func (app *Application) deleteProject(w http.ResponseWriter, r *http.Request) {
id, err := request.Param(r, "id")
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
count, err := app.Storage.Projects.Remove(app.Ctx, id)
if err != nil {
response.Error(w, err, http.StatusBadRequest)
return
}
response.WriteJSON(w, nil, http.StatusOK, count)
}