add another privilege methods, need test

This commit is contained in:
Pavel 2024-06-04 16:12:15 +03:00
parent 1df10f9e33
commit e2b4a699b2
3 changed files with 138 additions and 13 deletions

@ -3,6 +3,7 @@ package privilege_internal
import ( import (
"errors" "errors"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.uber.org/zap" "go.uber.org/zap"
our_errors "hub_admin_backend_service/internal/errors" our_errors "hub_admin_backend_service/internal/errors"
"hub_admin_backend_service/internal/models" "hub_admin_backend_service/internal/models"
@ -176,7 +177,12 @@ func (p *PrivilegeInternal) PostMany(c *fiber.Ctx) error {
result, err := p.repo.PostMany(c.Context(), req) result, err := p.repo.PostMany(c.Context(), req)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) switch {
case errors.Is(err, our_errors.ErrAlreadyExist):
return c.Status(fiber.StatusConflict).JSON(fiber.Map{"error": "One is privilege already exist"})
default:
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
} }
return c.Status(fiber.StatusOK).JSON(result) return c.Status(fiber.StatusOK).JSON(result)
@ -188,10 +194,60 @@ func (p *PrivilegeInternal) UpdateMany(c *fiber.Ctx) error {
if err := c.BodyParser(&req); err != nil { if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
} }
return c.SendStatus(http.StatusOK)
if len(req.Privileges) == 0 {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "len array dont be 0"})
}
for _, priv := range req.Privileges {
if !tools.Validate(priv) {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Missing required fields"})
}
}
result, err := p.repo.UpdateMany(c.Context(), req)
if err != nil {
switch {
case errors.Is(err, our_errors.ErrNotFound):
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "One is privilege not found"})
default:
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
}
return c.Status(fiber.StatusOK).JSON(result)
} }
// хаб нода restorePrivilege // хаб нода restorePrivilege
func (p *PrivilegeInternal) Restore(c *fiber.Ctx) error { func (p *PrivilegeInternal) Restore(c *fiber.Ctx) error {
var req struct {
ID string `json:"privilegeId"`
}
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
}
if req.ID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "PrivilegeID is required"})
}
_, err := primitive.ObjectIDFromHex(req.ID)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid id"})
}
result, err := p.repo.RestorePrivilege(c.Context(), req.ID)
if err != nil {
switch {
case errors.Is(err, our_errors.ErrNotFound):
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Privilege not found"})
default:
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
}
return c.Status(fiber.StatusOK).JSON(result)
return c.SendStatus(http.StatusOK) return c.SendStatus(http.StatusOK)
} }

@ -12,7 +12,6 @@ func (p *PrivilegeInternal) Register(router fiber.Router) {
router.Post("/many", p.PostMany) router.Post("/many", p.PostMany)
router.Put("/many", p.UpdateMany) router.Put("/many", p.UpdateMany)
router.Post("/restore", p.Restore) router.Post("/restore", p.Restore)
} }
func (p *PrivilegeInternal) Name() string { func (p *PrivilegeInternal) Name() string {

@ -93,7 +93,7 @@ func (p *Privilege) Update(ctx context.Context, req models.CreateUpdateReq) (mod
p.logger.Error("Failed to find privilege", zap.Error(err)) p.logger.Error("Failed to find privilege", zap.Error(err))
return models.Privilege{}, err return models.Privilege{}, err
} }
currTime := time.Now()
update := bson.M{ update := bson.M{
"$set": bson.M{ "$set": bson.M{
"name": req.Name, "name": req.Name,
@ -102,7 +102,7 @@ func (p *Privilege) Update(ctx context.Context, req models.CreateUpdateReq) (mod
"type": req.Type, "type": req.Type,
"value": req.Value, "value": req.Value,
"price": req.Price, "price": req.Price,
"updatedAt": time.Now(), "updatedAt": currTime,
}, },
} }
@ -118,7 +118,7 @@ func (p *Privilege) Update(ctx context.Context, req models.CreateUpdateReq) (mod
exist.Type = req.Type exist.Type = req.Type
exist.Value = req.Value exist.Value = req.Value
exist.Price = req.Price exist.Price = req.Price
exist.UpdatedAt = time.Now() exist.UpdatedAt = currTime
return exist, nil return exist, nil
} }
@ -193,8 +193,18 @@ func (p *Privilege) GetByServiceKey(ctx context.Context, serviceKey string) ([]m
} }
func (p *Privilege) PostMany(ctx context.Context, req models.ManyCreateUpdate) ([]models.Privilege, error) { func (p *Privilege) PostMany(ctx context.Context, req models.ManyCreateUpdate) ([]models.Privilege, error) {
var privileges []interface{} var privileges []models.Privilege
for _, r := range req.Privileges { for _, r := range req.Privileges {
exist := models.Privilege{}
err := p.mdb.FindOne(ctx, bson.M{"privilegeId": r.PrivilegeId}).Decode(exist)
if err == nil {
p.logger.Error("privilege already exists", zap.String("privilegeId", r.PrivilegeId))
return nil, errors.ErrAlreadyExist
} else if err != mongo.ErrNoDocuments {
p.logger.Error("failed to check existing privilege", zap.Error(err))
return nil, err
}
privileges = append(privileges, models.Privilege{ privileges = append(privileges, models.Privilege{
ID: primitive.NewObjectID(), ID: primitive.NewObjectID(),
Name: r.Name, Name: r.Name,
@ -209,17 +219,77 @@ func (p *Privilege) PostMany(ctx context.Context, req models.ManyCreateUpdate) (
}) })
} }
result, err := p.mdb.InsertMany(ctx, privileges) noneType := make([]interface{}, len(privileges))
for i, v := range privileges {
noneType[i] = v
}
_, err := p.mdb.InsertMany(ctx, noneType)
if err != nil { if err != nil {
p.logger.Error("failed to insert privileges", zap.Error(err)) p.logger.Error("failed to insert privileges", zap.Error(err))
return nil, err return nil, err
} }
inserted := make([]models.Privilege, len(result.InsertedIDs)) return privileges, nil
for i, id := range result.InsertedIDs { }
inserted[i] = privileges[i].(models.Privilege)
inserted[i].ID = id.(primitive.ObjectID) func (p *Privilege) UpdateMany(ctx context.Context, req models.ManyCreateUpdate) ([]models.Privilege, error) {
var updated []models.Privilege
for _, r := range req.Privileges {
filter := bson.M{"privilegeId": r.PrivilegeId}
update := bson.M{
"$set": bson.M{
"name": r.Name,
"serviceKey": r.ServiceKey,
"description": r.Description,
"type": r.Type,
"value": r.Value,
"price": r.Price,
"updatedAt": time.Now(),
},
}
var updatedPrivilege models.Privilege
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
err := p.mdb.FindOneAndUpdate(ctx, filter, update, opts).Decode(&updatedPrivilege)
if err != nil {
if err == mongo.ErrNoDocuments {
return nil, errors.ErrNotFound
}
p.logger.Error("failed to update privilege", zap.Error(err))
return nil, err
}
updated = append(updated, updatedPrivilege)
}
return updated, nil
}
func (p *Privilege) RestorePrivilege(ctx context.Context, id string) (models.Privilege, error) {
exist := models.Privilege{}
err := p.mdb.FindOne(ctx, bson.M{"privilegeId": id}).Decode(exist)
if err == mongo.ErrNoDocuments {
return models.Privilege{}, errors.ErrNotFound
} else if err != nil {
p.logger.Error("Failed to find privilege", zap.Error(err))
return models.Privilege{}, err
}
currTime := time.Now()
update := bson.M{
"$set": bson.M{
"isDeleted": false,
"updatedAt": currTime,
},
} }
return inserted, nil _, err = p.mdb.UpdateOne(ctx, bson.M{"privilegeId": id}, update)
if err != nil {
p.logger.Error("Failed to restore privilege", zap.Error(err))
return models.Privilege{}, err
}
exist.IsDeleted = false
exist.UpdatedAt = currTime
return exist, nil
} }