tariffs/internal/repository/tariff/tariff.go
2024-07-25 18:47:03 +03:00

126 lines
3.2 KiB
Go

package tariff
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.uber.org/zap"
"hub_admin_backend_service/internal/errors"
"hub_admin_backend_service/internal/models"
"math"
"time"
)
type Deps struct {
Mdb *mongo.Collection
Logger *zap.Logger
}
type Tariff struct {
mdb *mongo.Collection
logger *zap.Logger
}
func NewTariffRepo(deps Deps) *Tariff {
return &Tariff{
mdb: deps.Mdb,
logger: deps.Logger,
}
}
func (t *Tariff) GetByID(ctx context.Context, id primitive.ObjectID) (models.Tariff, error) {
var tariff models.Tariff
filter := bson.M{
"_id": id,
"isDeleted": false,
}
err := t.mdb.FindOne(ctx, filter).Decode(&tariff)
if err != nil {
if err == mongo.ErrNoDocuments {
return tariff, errors.ErrNotFound
}
t.logger.Error("failed to get tariff by object id", zap.Error(err))
return tariff, err
}
return tariff, nil
}
func (t *Tariff) Create(ctx context.Context, req models.Tariff) (models.Tariff, error) {
req.ID = primitive.NewObjectID()
req.CreatedAt = time.Now()
req.IsDeleted = false
req.UpdatedAt = time.Now()
_, err := t.mdb.InsertOne(ctx, req)
if err != nil {
t.logger.Error("failed insert tariff", zap.Error(err))
return req, err
}
return req, nil
}
func (t *Tariff) GetList(ctx context.Context, page, limit int64, userID string) (models.TariffPagination, error) {
var result models.TariffPagination
filter := bson.M{
"$or": []bson.M{
{"isCustom": false, "isDeleted": false},
},
}
if userID != "" {
filter["$or"] = append(filter["$or"].([]bson.M), bson.M{"isCustom": true, "userID": userID})
}
count, err := t.mdb.CountDocuments(ctx, filter)
if err != nil {
t.logger.Error("failed count tariffs", zap.Error(err))
return result, err
}
totalPages := int(math.Ceil(float64(count) / float64(limit)))
offset := (page - 1) * limit
findOptions := options.Find().SetSort(bson.D{{"order", 1}}).SetSkip(offset).SetLimit(limit)
cursor, err := t.mdb.Find(ctx, filter, findOptions)
if err != nil {
t.logger.Error("failed find tariffs", zap.Error(err))
return result, err
}
defer cursor.Close(ctx)
var tariffs []models.Tariff
if err = cursor.All(ctx, &tariffs); err != nil {
t.logger.Error("failed decode tariffs", zap.Error(err))
return result, err
}
result.TotalPages = totalPages
result.Tariffs = tariffs
return result, nil
}
func (t *Tariff) SoftDelete(ctx context.Context, tariffID primitive.ObjectID) (models.Tariff, error) {
var tariff models.Tariff
filter := bson.M{"_id": tariffID}
update := bson.M{"$set": bson.M{"isDeleted": true, "deletedAt": time.Now()}}
err := t.mdb.FindOneAndUpdate(ctx, filter, update, options.FindOneAndUpdate().SetReturnDocument(options.After)).Decode(&tariff)
if err == mongo.ErrNoDocuments {
return tariff, errors.ErrNotFound
} else if err != nil {
t.logger.Error("failed soft delete tariff", zap.Error(err))
return tariff, err
}
return tariff, nil
}
func (t *Tariff) Update(ctx context.Context, tariffID primitive.ObjectID, req models.Tariff) (models.Tariff, error) {
var tariff models.Tariff
return tariff, nil
}