Compare commits
3 Commits
0388df48f5
...
563808ecdf
| Author | SHA1 | Date | |
|---|---|---|---|
| 563808ecdf | |||
| 376ce4ca62 | |||
| 7fd02119b8 |
@@ -11,11 +11,13 @@ import (
|
|||||||
api_acladmin "git.oblat.lv/alex/triggerssmith/api/acl_admin"
|
api_acladmin "git.oblat.lv/alex/triggerssmith/api/acl_admin"
|
||||||
api_auth "git.oblat.lv/alex/triggerssmith/api/auth"
|
api_auth "git.oblat.lv/alex/triggerssmith/api/auth"
|
||||||
api_block "git.oblat.lv/alex/triggerssmith/api/block"
|
api_block "git.oblat.lv/alex/triggerssmith/api/block"
|
||||||
|
api_user "git.oblat.lv/alex/triggerssmith/api/user"
|
||||||
_ "git.oblat.lv/alex/triggerssmith/docs"
|
_ "git.oblat.lv/alex/triggerssmith/docs"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/acl"
|
"git.oblat.lv/alex/triggerssmith/internal/acl"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/auth"
|
"git.oblat.lv/alex/triggerssmith/internal/auth"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/config"
|
"git.oblat.lv/alex/triggerssmith/internal/config"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/server"
|
"git.oblat.lv/alex/triggerssmith/internal/server"
|
||||||
|
"git.oblat.lv/alex/triggerssmith/internal/user"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/vars"
|
"git.oblat.lv/alex/triggerssmith/internal/vars"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
"github.com/go-chi/chi/v5/middleware"
|
"github.com/go-chi/chi/v5/middleware"
|
||||||
@@ -30,12 +32,15 @@ type Router struct {
|
|||||||
authService *auth.Service
|
authService *auth.Service
|
||||||
|
|
||||||
aclService *acl.Service
|
aclService *acl.Service
|
||||||
|
|
||||||
|
userService *user.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
type RouterDependencies struct {
|
type RouterDependencies struct {
|
||||||
AuthService *auth.Service
|
AuthService *auth.Service
|
||||||
Configuration *config.Config
|
Configuration *config.Config
|
||||||
ACLService *acl.Service
|
ACLService *acl.Service
|
||||||
|
UserService *user.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRouter(deps RouterDependencies) *Router {
|
func NewRouter(deps RouterDependencies) *Router {
|
||||||
@@ -48,12 +53,16 @@ func NewRouter(deps RouterDependencies) *Router {
|
|||||||
if deps.ACLService == nil {
|
if deps.ACLService == nil {
|
||||||
panic("ACLService is required")
|
panic("ACLService is required")
|
||||||
}
|
}
|
||||||
|
if deps.UserService == nil {
|
||||||
|
panic("UserService is required")
|
||||||
|
}
|
||||||
r := chi.NewRouter()
|
r := chi.NewRouter()
|
||||||
return &Router{
|
return &Router{
|
||||||
r: r,
|
r: r,
|
||||||
cfg: deps.Configuration,
|
cfg: deps.Configuration,
|
||||||
authService: deps.AuthService,
|
authService: deps.AuthService,
|
||||||
aclService: deps.ACLService,
|
aclService: deps.ACLService,
|
||||||
|
userService: deps.UserService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +101,8 @@ func (r *Router) MustRoute() chi.Router {
|
|||||||
api.Route("/block", api_block.MustRoute(r.cfg))
|
api.Route("/block", api_block.MustRoute(r.cfg))
|
||||||
authRoute := api_auth.MustRoute(r.cfg, r.authService)
|
authRoute := api_auth.MustRoute(r.cfg, r.authService)
|
||||||
api.Route("/auth", authRoute)
|
api.Route("/auth", authRoute)
|
||||||
//api.Route("/users", authRoute) // legacy support
|
usersRoute := api_user.MustRoute(r.cfg, r.userService)
|
||||||
|
api.Route("/users", usersRoute)
|
||||||
aclAdminRoute := api_acladmin.MustRoute(r.cfg, r.aclService, r.authService)
|
aclAdminRoute := api_acladmin.MustRoute(r.cfg, r.aclService, r.authService)
|
||||||
api.Route("/acl", aclAdminRoute)
|
api.Route("/acl", aclAdminRoute)
|
||||||
api.Route("/acl-admin", aclAdminRoute) // legacy support
|
api.Route("/acl-admin", aclAdminRoute) // legacy support
|
||||||
|
|||||||
@@ -1,14 +1,20 @@
|
|||||||
package api_user
|
package api_user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"log/slog"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/config"
|
"git.oblat.lv/alex/triggerssmith/internal/config"
|
||||||
|
"git.oblat.lv/alex/triggerssmith/internal/server"
|
||||||
"git.oblat.lv/alex/triggerssmith/internal/user"
|
"git.oblat.lv/alex/triggerssmith/internal/user"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
type userHandler struct {
|
type userHandler struct {
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
a *user.Service
|
u *user.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
func MustRoute(config *config.Config, userService *user.Service) func(chi.Router) {
|
func MustRoute(config *config.Config, userService *user.Service) func(chi.Router) {
|
||||||
@@ -20,14 +26,78 @@ func MustRoute(config *config.Config, userService *user.Service) func(chi.Router
|
|||||||
}
|
}
|
||||||
h := &userHandler{
|
h := &userHandler{
|
||||||
cfg: config,
|
cfg: config,
|
||||||
a: userService,
|
u: userService,
|
||||||
}
|
}
|
||||||
|
|
||||||
return func(r chi.Router) {
|
return func(r chi.Router) {
|
||||||
r.Get("/", h.getUsers) // /users
|
r.Get("/", h.getUsers) // /users
|
||||||
r.Get("/{userId}", h.GetUser) // /users/{userId}
|
r.Get("/{userId}", h.GetUser) // /users/{userId}
|
||||||
r.Post("/", h.createUser) // /users
|
//r.Post("/", h.createUser) // /users
|
||||||
r.Patch("/{userId}", h.updateUser) // /users/{userId}
|
//r.Patch("/{userId}", h.updateUser) // /users/{userId}
|
||||||
r.Delete("/{userId}", h.deleteUser) // /users/{userId}
|
//r.Delete("/{userId}", h.deleteUser) // /users/{userId}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type getUserResponseUnit struct {
|
||||||
|
UserId uint `json:"userId"`
|
||||||
|
UserName string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type getUsersResponse []getUserResponseUnit
|
||||||
|
|
||||||
|
// @Summary Get all user list
|
||||||
|
// @Tags users
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {object} getUsersResponse
|
||||||
|
// @Failure 500 {object} server.ProblemDetails
|
||||||
|
// @Router /api/users [get]
|
||||||
|
func (h *userHandler) getUsers(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
users, err := h.u.GetUsers()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("failed get users", "err", err.Error())
|
||||||
|
server.WriteProblem(w, http.StatusInternalServerError, "/errors/internal-server-error", "Internal Server Error", "Failed to get all user list", r)
|
||||||
|
}
|
||||||
|
var resp_users getUsersResponse
|
||||||
|
for _, user := range users {
|
||||||
|
resp_users = append(resp_users, getUserResponseUnit{
|
||||||
|
UserId: user.ID,
|
||||||
|
UserName: user.Username,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
json.NewEncoder(w).Encode(resp_users)
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Summary Get user by ID
|
||||||
|
// @Tags users
|
||||||
|
// @Produce json
|
||||||
|
// @Param userId path int true "User ID"
|
||||||
|
// @Success 200 {object} getUserResponseUnit
|
||||||
|
// @Failure 400 {object} server.ProblemDetails
|
||||||
|
// @Failure 404 {object} server.ProblemDetails
|
||||||
|
// @Failure 500 {object} server.ProblemDetails
|
||||||
|
// @Router /api/users/{userId} [get]
|
||||||
|
func (h *userHandler) GetUser(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
userIdStr := chi.URLParam(r, "userId")
|
||||||
|
userId, err := strconv.Atoi(userIdStr)
|
||||||
|
if err != nil || userId < 0 {
|
||||||
|
server.WriteProblem(w, http.StatusBadRequest, "/errors/acl/invalid-user-id", "Invalid user ID", "User ID must be positive integer", r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
user, err := h.u.GetBy("id", userIdStr)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("failed get user by id", "err", err.Error())
|
||||||
|
server.WriteProblem(w, http.StatusInternalServerError, "/errors/internal-server-error", "Internal Server Error", "Failed to get user by ID, may not found", r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if user == nil {
|
||||||
|
server.WriteProblem(w, http.StatusNotFound, "/errors/not-found", "Not Found", "User not found", r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp_user := getUserResponseUnit{
|
||||||
|
UserId: user.ID,
|
||||||
|
UserName: user.Username,
|
||||||
|
}
|
||||||
|
json.NewEncoder(w).Encode(resp_user)
|
||||||
|
}
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ var serveCmd = &cobra.Command{
|
|||||||
AuthService: authService,
|
AuthService: authService,
|
||||||
Configuration: cfg,
|
Configuration: cfg,
|
||||||
ACLService: aclService,
|
ACLService: aclService,
|
||||||
|
UserService: userService,
|
||||||
})
|
})
|
||||||
|
|
||||||
srv.SetHandler(router.MustRoute())
|
srv.SetHandler(router.MustRoute())
|
||||||
|
|||||||
@@ -46,7 +46,8 @@ func (s *Service) GetUsers() (Users, error) {
|
|||||||
if !s.isInitialized() {
|
if !s.isInitialized() {
|
||||||
return nil, fmt.Errorf("user service is not initialized")
|
return nil, fmt.Errorf("user service is not initialized")
|
||||||
}
|
}
|
||||||
return s.store.GetUsers()
|
users, err := s.store.GetUsers()
|
||||||
|
return *users, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) GetBy(by, value string) (*User, error) {
|
func (s *Service) GetBy(by, value string) (*User, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user