Initial commit: Open sourcing all of the Maple Open Technologies code.
This commit is contained in:
commit
755d54a99d
2010 changed files with 448675 additions and 0 deletions
|
|
@ -0,0 +1,79 @@
|
|||
package user
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
userdto "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/interface/http/dto/user"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/interface/http/middleware"
|
||||
userservice "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/service/user"
|
||||
userusecase "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/usecase/user"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/httperror"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/httpresponse"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/httpvalidation"
|
||||
)
|
||||
|
||||
// CreateHandler handles user creation HTTP requests
|
||||
type CreateHandler struct {
|
||||
service userservice.CreateUserService
|
||||
logger *zap.Logger
|
||||
}
|
||||
|
||||
// ProvideCreateHandler creates a new CreateHandler
|
||||
func ProvideCreateHandler(service userservice.CreateUserService, logger *zap.Logger) *CreateHandler {
|
||||
return &CreateHandler{
|
||||
service: service,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// Handle handles the HTTP request for creating a user
|
||||
func (h *CreateHandler) Handle(w http.ResponseWriter, r *http.Request) {
|
||||
// Extract tenant from context (set by middleware)
|
||||
tenantID, err := middleware.GetTenantID(r.Context())
|
||||
if err != nil {
|
||||
httperror.ProblemUnauthorized(w, "Tenant context is required to access this resource.")
|
||||
return
|
||||
}
|
||||
|
||||
// CWE-436: Validate Content-Type before parsing
|
||||
if err := httpvalidation.ValidateJSONContentType(r); err != nil {
|
||||
httperror.ProblemBadRequest(w, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// Parse request body
|
||||
var req userdto.CreateRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
httperror.ProblemBadRequest(w, "Invalid request body format. Please check your JSON syntax.")
|
||||
return
|
||||
}
|
||||
|
||||
// Map DTO to use case input
|
||||
input := &userusecase.CreateUserInput{
|
||||
Email: req.Email,
|
||||
FirstName: req.FirstName,
|
||||
LastName: req.LastName,
|
||||
}
|
||||
|
||||
// Call service
|
||||
output, err := h.service.CreateUser(r.Context(), tenantID, input)
|
||||
if err != nil {
|
||||
h.logger.Error("failed to create user", zap.Error(err))
|
||||
httperror.ProblemInternalServerError(w, "Failed to create user. Please try again later.")
|
||||
return
|
||||
}
|
||||
|
||||
// Map to response DTO
|
||||
response := userdto.CreateResponse{
|
||||
ID: output.ID,
|
||||
Email: output.Email,
|
||||
Name: output.Name,
|
||||
CreatedAt: output.CreatedAt,
|
||||
}
|
||||
|
||||
// Write response
|
||||
httpresponse.Created(w, response)
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
package user
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
userdto "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/interface/http/dto/user"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/interface/http/middleware"
|
||||
userservice "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/service/user"
|
||||
userusecase "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/usecase/user"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/httperror"
|
||||
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/httpresponse"
|
||||
)
|
||||
|
||||
// GetHandler handles getting a user by ID
|
||||
type GetHandler struct {
|
||||
service userservice.GetUserService
|
||||
logger *zap.Logger
|
||||
}
|
||||
|
||||
// ProvideGetHandler creates a new GetHandler
|
||||
func ProvideGetHandler(service userservice.GetUserService, logger *zap.Logger) *GetHandler {
|
||||
return &GetHandler{
|
||||
service: service,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// Handle handles the HTTP request for getting a user
|
||||
func (h *GetHandler) Handle(w http.ResponseWriter, r *http.Request) {
|
||||
// Extract tenant from context
|
||||
tenantID, err := middleware.GetTenantID(r.Context())
|
||||
if err != nil {
|
||||
httperror.ProblemUnauthorized(w, "Tenant context is required to access this resource.")
|
||||
return
|
||||
}
|
||||
|
||||
// Get user ID from path parameter
|
||||
id := r.PathValue("id")
|
||||
if id == "" {
|
||||
httperror.ProblemBadRequest(w, "User ID is required in the request path.")
|
||||
return
|
||||
}
|
||||
|
||||
// Call service
|
||||
input := &userusecase.GetUserInput{ID: id}
|
||||
output, err := h.service.GetUser(r.Context(), tenantID, input)
|
||||
if err != nil {
|
||||
h.logger.Error("failed to get user", zap.Error(err))
|
||||
httperror.ProblemNotFound(w, "The requested user could not be found.")
|
||||
return
|
||||
}
|
||||
|
||||
// Map to response DTO
|
||||
response := userdto.GetResponse{
|
||||
ID: output.ID,
|
||||
Email: output.Email,
|
||||
Name: output.Name,
|
||||
CreatedAt: output.CreatedAt,
|
||||
UpdatedAt: output.UpdatedAt,
|
||||
}
|
||||
|
||||
// Write response
|
||||
httpresponse.OK(w, response)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue