You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.8 KiB
69 lines
1.8 KiB
package repository |
|
|
|
import ( |
|
"context" |
|
"time" |
|
|
|
"gorm.io/gorm" |
|
) |
|
|
|
type CaptchaRepository interface { |
|
Create(ctx context.Context, captchaID, captchaText string, expiresAt time.Time) error |
|
Get(ctx context.Context, captchaID string) (string, error) |
|
Delete(ctx context.Context, captchaID string) error |
|
CleanExpired(ctx context.Context) error |
|
} |
|
|
|
type captchaRepository struct { |
|
db *gorm.DB |
|
} |
|
|
|
type Captcha struct { |
|
ID string `gorm:"primarykey;size:32;table:captchas" json:"id"` |
|
Text string `gorm:"size:10;not null" json:"-"` |
|
ExpiresAt time.Time `gorm:"not null;index" json:"expires_at"` |
|
CreatedAt time.Time `gorm:"not null" json:"created_at"` |
|
} |
|
|
|
// TableName 指定表名 |
|
func (Captcha) TableName() string { |
|
return "captchas" |
|
} |
|
|
|
func NewCaptchaRepository(db *gorm.DB) CaptchaRepository { |
|
return &captchaRepository{ |
|
db: db, |
|
} |
|
} |
|
|
|
func (r *captchaRepository) Create(ctx context.Context, captchaID, captchaText string, expiresAt time.Time) error { |
|
captcha := &Captcha{ |
|
ID: captchaID, |
|
Text: captchaText, |
|
ExpiresAt: expiresAt, |
|
CreatedAt: time.Now(), |
|
} |
|
|
|
return r.db.WithContext(ctx).Create(captcha).Error |
|
} |
|
|
|
func (r *captchaRepository) Get(ctx context.Context, captchaID string) (string, error) { |
|
var captcha Captcha |
|
err := r.db.WithContext(ctx).Where("id = ? AND expires_at > ?", captchaID, time.Now()).First(&captcha).Error |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
// 获取后立即删除,确保一次性使用 |
|
r.db.WithContext(ctx).Delete(&captcha) |
|
|
|
return captcha.Text, nil |
|
} |
|
|
|
func (r *captchaRepository) Delete(ctx context.Context, captchaID string) error { |
|
return r.db.WithContext(ctx).Where("id = ?", captchaID).Delete(&Captcha{}).Error |
|
} |
|
|
|
func (r *captchaRepository) CleanExpired(ctx context.Context) error { |
|
return r.db.WithContext(ctx).Where("expires_at <= ?", time.Now()).Delete(&Captcha{}).Error |
|
}
|
|
|