package implements import ( "context" "gitea.konchin.com/go2025/backend/models" "gitea.konchin.com/go2025/backend/tracing" "gitea.konchin.com/go2025/backend/utils" "github.com/uptrace/bun" "go.uber.org/zap" ) type BunDatabase struct { db *bun.DB } func NewBunDatabase(db *bun.DB) *BunDatabase { return &BunDatabase{db: db} } func (self *BunDatabase) GetSession( ctx context.Context, loginToken string, ) (models.Session, error) { ret := models.Session{ LoginToken: loginToken, } err := self.db.NewSelect(). Model(&ret). Where("login_token = ?", loginToken). Scan(ctx) if err != nil { return models.Session{}, err } return ret, nil } func (self *BunDatabase) UpdateRefreshToken( ctx context.Context, userId string, ) (models.Session, error) { ret := models.Session{ UserId: userId, } err := self.db.NewSelect(). Model(&ret). WherePK(). Scan(ctx) if err != nil { return models.Session{}, err } if err := ret.RotateRefreshToken(); err != nil { tracing.Logger.Ctx(ctx). Error("failed to rotate refresh token", zap.Error(err)) return models.Session{}, err } _, err = self.db.NewUpdate(). Model((*models.Session)(nil)). Set("refresh_token = ?", ret.RefreshToken). Where("user_id = ?", userId). Exec(ctx) if err != nil { return models.Session{}, err } return ret, nil } func (self *BunDatabase) UpsertLoginToken( ctx context.Context, userId string, ) (string, error) { token, err := utils.RandomString(24) if err != nil { return "", err } session := models.Session{ UserId: userId, LoginToken: token, } _, err = self.db.NewInsert(). Model(&session). On("CONFLICT (user_id) DO UPDATE"). Set("login_token = EXCLUDED.login_token"). Exec(ctx) if err != nil { return "", err } return token, nil }