package controller import ( "errors" "github.com/gin-gonic/gin" "hy2xs-admin/model/constant" "hy2xs-admin/model/dto" "hy2xs-admin/model/vo" "hy2xs-admin/service" ) // Вход в панель живёт в собственном файле, а не среди обработчиков пиров. // // Это не косметика. Пока Login лежал в controller/peer.go, паника валидатора на // форме входа приходила в journal стеком `controller/peer.go:50`, и первая // гипотеза при разборе RC2 указывала на управление пирами — то есть на // подсистему, не имеющую к отказу никакого отношения. Самая ценная дверь // продукта обязана называться своим именем в стеке. func Login(c *gin.Context) { loginDto, err := validateField(c, dto.LoginDto{}) if err != nil { return } token, forcePasswordChange, err := service.Login(*loginDto.Username, *loginDto.Pass) if err != nil { // Неверные учётные данные получают код, чтобы панель показала // оператору внятную фразу на его языке. Отказ базы остаётся системной // ошибкой: выдавать «неверный логин или пароль» при недоступной SQLite // значит отправить оператора искать несуществующую опечатку. if errors.Is(err, service.ErrInvalidCredentials) { vo.FailDomain(constant.ErrCodeInvalidCredentials, err.Error(), c) return } vo.Fail(err.Error(), c) return } vo.Success(vo.JwtVo{TokenType: constant.TokenType, AccessToken: token, ForcePasswordChange: forcePasswordChange}, c) }