package auth import ( "io" "log" "net/http" "management/internal/erpserver/model/form" v1 "management/internal/erpserver/service/v1" "management/internal/erpserver/templ/auth" "management/internal/pkg/binding" "management/internal/pkg/mid" "management/internal/pkg/render" "management/internal/pkg/session" "github.com/drhin/logger" ) type app struct { log *logger.Logger sm session.Manager render render.Renderer captchaService v1.CaptchaService userService v1.UserService } func newApp( log *logger.Logger, sm session.Manager, render render.Renderer, captchaService v1.CaptchaService, userService v1.UserService, ) *app { return &app{ log: log, sm: sm, render: render, captchaService: captchaService, userService: userService, } } func (a *app) login(w http.ResponseWriter, r *http.Request) { ctx := r.Context() switch r.Method { case http.MethodGet: u := mid.GetUser(ctx) if u.ID > 0 { if err := a.sm.RenewToken(ctx); err == nil { http.Redirect(w, r, "/home.html", http.StatusFound) return } } _ = a.sm.Destroy(ctx) component := auth.Login(ctx) a.render.Render(ctx, w, component) case http.MethodPost: defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { a.log.Error(err.Error(), err) } }(r.Body) var req form.Login if err := binding.Form.Bind(r, &req); err != nil { e := binding.ValidatorErrors(err) a.render.JSONErr(w, e) return } if !a.captchaService.Verify(req.CaptchaID, req.Captcha, true) { a.render.JSONErr(w, "验证码错误") return } req = req.SetAttributes(r) err := a.userService.Login(ctx, &req) if err != nil { log.Println(err) a.render.JSONErr(w, err.Error()) return } a.render.JSONOk(w, "login successfully") default: http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) } } func (a *app) logout(w http.ResponseWriter, r *http.Request) { err := a.sm.Destroy(r.Context()) if err != nil { a.log.Error(err.Error(), err) } http.Redirect(w, r, "/", http.StatusFound) }