Files
inp2025/handlers/auth/postLogin.go
2025-10-16 07:12:01 +08:00

64 lines
1.4 KiB
Go

package auth
import (
"net/http"
"gitea.konchin.com/ytshih/inp2025/middlewares"
"gitea.konchin.com/ytshih/inp2025/models"
"gitea.konchin.com/ytshih/inp2025/types"
"github.com/uptrace/bunrouter"
)
type PostLoginOutput struct {
LoginCount int `msgpack:"loginCount"`
}
func (self *Handlers) PostLogin(
w http.ResponseWriter,
req bunrouter.Request,
) error {
ctx := req.Context()
user, ok := ctx.Value(types.UserKey).(models.User)
if !ok {
return middlewares.HTTPError{
StatusCode: http.StatusUnauthorized,
Message: "user not login",
}
}
res, err := self.db.NewUpdate().
Model(&user).
Set("login_count = login_count + ?", 1).
Set("is_logged = ?", true).
Where("is_logged = ?", false).
Where("username = ?", user.Username).
Returning("*").
Exec(ctx)
if err != nil {
return middlewares.HTTPError{
StatusCode: http.StatusInternalServerError,
Message: "failed to update login count",
OriginError: err,
}
}
if cnt, err := res.RowsAffected(); err != nil || cnt == 0 {
if err != nil {
return middlewares.HTTPError{
StatusCode: http.StatusInternalServerError,
Message: "failed to get affected row count",
OriginError: err,
}
}
if cnt == 0 {
return middlewares.HTTPError{
StatusCode: http.StatusUnauthorized,
Message: "already logged in",
}
}
}
return bunrouter.JSON(w, PostLoginOutput{
LoginCount: user.LoginCount,
})
}