package handlers import ( "encoding/json" "net/http" "devone.aplikasi.web.id/gitea/mario/go-ohif-proxy/internal/api/service" "go.uber.org/zap" ) // RegisterHandler handles user registration requests type RegisterHandler struct { logger *zap.Logger registerService *service.RegisterService } // NewRegisterHandler creates a new registration handler func NewRegisterHandler(logger *zap.Logger, registerService *service.RegisterService) *RegisterHandler { return &RegisterHandler{ logger: logger, registerService: registerService, } } // Register handles the creation of new users, patients, and doctors func (h *RegisterHandler) Register(w http.ResponseWriter, r *http.Request) { // Parse registration request var req service.RegisterRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { h.logger.Error("Failed to parse registration request", zap.Error(err)) http.Error(w, "Invalid request body", http.StatusBadRequest) return } // Validate required fields if req.Email == "" || req.Password == "" || req.Name == "" || req.Role == "" { http.Error(w, "Missing required fields", http.StatusBadRequest) return } // Perform registration user, err := h.registerService.Register(&req) if err != nil { switch err { case service.ErrEmailExists: http.Error(w, "Email already exists", http.StatusConflict) case service.ErrInvalidRole: http.Error(w, "Invalid user role", http.StatusBadRequest) case service.ErrInvalidPatient: http.Error(w, "Invalid patient data", http.StatusBadRequest) case service.ErrInvalidDoctor: http.Error(w, "Invalid doctor data", http.StatusBadRequest) default: h.logger.Error("Registration failed", zap.Error(err)) http.Error(w, "Registration failed", http.StatusInternalServerError) } return } // Return created user w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) // Don't include password in response user.Password = "" json.NewEncoder(w).Encode(user) }