codeword/internal/repository/promocode_repository.go

55 lines
1.3 KiB
Go
Raw Normal View History

2024-01-11 16:29:53 +00:00
package repository
import (
"codeword/internal/models"
"context"
2024-01-11 18:20:33 +00:00
"errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
2024-01-11 16:29:53 +00:00
"go.mongodb.org/mongo-driver/mongo"
2024-01-11 18:20:33 +00:00
"go.mongodb.org/mongo-driver/mongo/options"
2024-01-11 16:29:53 +00:00
"time"
)
2024-01-11 18:20:33 +00:00
var ErrDuplicateCodeword = errors.New("duplicate codeword")
2024-01-11 16:29:53 +00:00
type PromoCodeRepository struct {
mdb *mongo.Collection
}
func NewPromoCodeRepository(mdb *mongo.Collection) *PromoCodeRepository {
2024-01-11 18:20:33 +00:00
indexModel := mongo.IndexModel{
Keys: bson.D{
{"codeword", 1},
{"delete", 1},
},
Options: options.Index().SetUnique(true).SetPartialFilterExpression(bson.M{"delete": false}),
}
_, err := mdb.Indexes().CreateOne(context.Background(), indexModel)
if err != nil {
panic(err)
}
2024-01-11 16:29:53 +00:00
return &PromoCodeRepository{mdb: mdb}
}
2024-01-11 18:23:15 +00:00
func (r *PromoCodeRepository) CreatePromoCode(ctx context.Context, promoCode *models.PromoCode) (*models.PromoCode, error) {
2024-01-11 16:29:53 +00:00
promoCode.CreatedAt = time.Now()
2024-01-11 18:20:33 +00:00
promoCode.ID = primitive.NewObjectID()
2024-01-11 16:29:53 +00:00
_, err := r.mdb.InsertOne(ctx, promoCode)
if err != nil {
2024-01-11 18:20:33 +00:00
if writeErr, ok := err.(mongo.WriteException); ok {
for _, writeError := range writeErr.WriteErrors {
if writeError.Code == 11000 {
return nil, ErrDuplicateCodeword
}
}
}
2024-01-11 16:29:53 +00:00
return nil, err
}
2024-01-11 18:20:33 +00:00
2024-01-11 16:29:53 +00:00
return promoCode, nil
}