implemented mongo gridFS for file upload

This commit is contained in:
m.nazemi
2026-04-21 19:07:51 +03:30
parent 74d9269a19
commit 3aabd95b1c
16 changed files with 1941 additions and 17 deletions
+51 -6
View File
@@ -9,6 +9,7 @@ import (
"tm/pkg/response"
"go.mongodb.org/mongo-driver/v2/bson"
mongopkg "go.mongodb.org/mongo-driver/v2/mongo"
)
// Repository defines methods for user data access
@@ -26,8 +27,9 @@ type Repository interface {
// userRepository implements the Repository interface using the MongoDB ORM
type userRepository struct {
ormRepo orm.Repository[User]
logger logger.Logger
ormRepo orm.Repository[User]
collection *mongopkg.Collection
logger logger.Logger
}
// NewUserRepository creates a new user repository
@@ -46,11 +48,13 @@ func NewRepository(mongoManager *orm.ConnectionManager, logger logger.Logger) Re
}
// Create ORM repository
ormRepo := orm.NewRepository[User](mongoManager.GetCollection("users"), logger)
collection := mongoManager.GetCollection("users")
ormRepo := orm.NewRepository[User](collection, logger)
return &userRepository{
ormRepo: ormRepo,
logger: logger,
ormRepo: ormRepo,
collection: collection,
logger: logger,
}
}
@@ -117,6 +121,35 @@ func (r *userRepository) Update(ctx context.Context, user *User) error {
// Use ORM to update user
err := r.ormRepo.Update(ctx, user)
if err != nil {
// Backward compatibility for legacy records with string _id.
legacyFilterID := user.ID.Hex()
updateDoc := bson.M{
"$set": bson.M{
"full_name": user.FullName,
"username": user.Username,
"email": user.Email,
"password": user.Password,
"role": user.Role,
"status": user.Status,
"department": user.Department,
"position": user.Position,
"phone": user.Phone,
"profile_image": user.ProfileImage,
"device_token": user.DeviceToken,
"is_verified": user.IsVerified,
"last_login_at": user.LastLoginAt,
"updated_at": user.UpdatedAt,
},
}
legacyResult, legacyErr := r.collection.UpdateOne(ctx, bson.M{"_id": legacyFilterID}, updateDoc)
if legacyErr == nil && legacyResult.MatchedCount > 0 {
r.logger.Info("User updated successfully using legacy string ID", map[string]interface{}{
"user_id": legacyFilterID,
"email": user.Email,
})
return nil
}
r.logger.Error("Failed to update user", map[string]interface{}{
"error": err.Error(),
"user_id": user.ID,
@@ -137,7 +170,19 @@ func (r *userRepository) GetByID(ctx context.Context, id string) (*User, error)
user, err := r.ormRepo.FindByID(ctx, id)
if err != nil {
if errors.Is(err, orm.ErrDocumentNotFound) {
return nil, errors.New("user not found")
// Backward compatibility: some legacy seed data may store _id as string instead of ObjectID.
legacyUser, legacyErr := r.ormRepo.FindOne(ctx, bson.M{"_id": id})
if legacyErr == nil {
return legacyUser, nil
}
if errors.Is(legacyErr, orm.ErrDocumentNotFound) {
return nil, errors.New("user not found")
}
r.logger.Error("Failed to get user by legacy string ID", map[string]interface{}{
"error": legacyErr.Error(),
"user_id": id,
})
return nil, legacyErr
}
r.logger.Error("Failed to get user by ID", map[string]interface{}{
"error": err.Error(),