// Copyright (c) 2025 Nikolai Papin // // This file is part of Easywish // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See // the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package controllers import ( "easywish/internal/middleware" "easywish/internal/models" "easywish/internal/services" "easywish/internal/utils" "easywish/internal/utils/enums" "net/http" "github.com/gin-gonic/gin" "go.uber.org/zap" ) type AuthController interface { RegistrationBegin(c *gin.Context) RegistrationComplete(c *gin.Context) Login(c *gin.Context) Refresh(c *gin.Context) PasswordResetBegin(c *gin.Context) PasswordResetComplete(c *gin.Context) Router } type authControllerImpl struct { authService services.AuthService log *zap.Logger } func NewAuthController(_log *zap.Logger, as services.AuthService) AuthController { return &authControllerImpl{log: _log, authService: as} } // Login implements AuthController. // @Summary Acquire tokens via login credentials (and 2FA code if needed) // @Tags Auth // @Accept json // @Produce json // @Param request body models.LoginRequest true "desc" // @Success 200 {object} models.LoginResponse "desc" // @Router /auth/login [post] func (a *authControllerImpl) Login(c *gin.Context) { c.Status(http.StatusNotImplemented) } // PasswordResetBegin implements AuthController. // @Summary Request password reset email // @Tags Auth // @Accept json // @Produce json // @Router /auth/passwordResetBegin [post] func (a *authControllerImpl) PasswordResetBegin(c *gin.Context) { c.Status(http.StatusNotImplemented) } // PasswordResetComplete implements AuthController. // @Summary Complete password reset with email code and provide 2FA code or backup code if needed // @Tags Auth // @Accept json // @Produce json // @Router /auth/passwordResetComplete [post] func (a *authControllerImpl) PasswordResetComplete(c *gin.Context) { c.Status(http.StatusNotImplemented) } // Refresh implements AuthController. // @Summary Receive new tokens via refresh token // @Tags Auth // @Accept json // @Produce json // @Router /auth/refresh [post] func (a *authControllerImpl) Refresh(c *gin.Context) { c.Status(http.StatusNotImplemented) } // RegistrationComplete implements AuthController. // @Summary Register an account // @Tags Auth // @Accept json // @Produce json // @Param request body models.RegistrationBeginRequest true "desc" // @Router /auth/registrationBegin [post] func (a *authControllerImpl) RegistrationBegin(c *gin.Context) { request, ok := utils.GetRequest[models.RegistrationBeginRequest](c) if !ok { c.Status(http.StatusBadRequest) return } _, err := a.authService.RegistrationBegin(request.Body) if err != nil { c.JSON(http.StatusBadRequest, err.Error()) return } c.Status(http.StatusAccepted) return } // RegistrationBegin implements AuthController. // @Summary Confirm with code, finish creating the account // @Tags Auth // @Accept json // @Produce json // @Router /auth/registrationComplete [post] func (a *authControllerImpl) RegistrationComplete(c *gin.Context) { c.Status(http.StatusNotImplemented) } func (a *authControllerImpl) RegisterRoutes(group *gin.RouterGroup) { group.POST("/registrationBegin", middleware.RequestMiddleware[models.RegistrationBeginRequest](enums.GuestRole), a.RegistrationBegin) group.POST("/registrationComplete", a.RegistrationComplete) group.POST("/login", a.Login) group.POST("/refresh", a.Refresh) group.POST("/passwordResetBegin", a.PasswordResetBegin) group.POST("/passwordResetComplete", a.PasswordResetComplete) }