Merge pull request #7 from Selly-Modules/feature/Permission
add permisstionMethods
This commit is contained in:
		
						commit
						d8dcfbcad4
					
				
							
								
								
									
										27
									
								
								action.go
								
								
								
								
							
							
						
						
									
										27
									
								
								action.go
								
								
								
								
							|  | @ -2,6 +2,7 @@ package usermngmt | |||
| 
 | ||||
| import ( | ||||
| 	"github.com/Selly-Modules/usermngmt/model" | ||||
| 	"github.com/Selly-Modules/usermngmt/permission" | ||||
| 	"github.com/Selly-Modules/usermngmt/role" | ||||
| 	"github.com/Selly-Modules/usermngmt/user" | ||||
| ) | ||||
|  | @ -42,6 +43,11 @@ func (s Service) ChangeAllUsersStatus(roleID, status string) error { | |||
| 	return user.ChangeAllUsersStatus(roleID, status) | ||||
| } | ||||
| 
 | ||||
| // LoginWithEmailAndPassword ...
 | ||||
| func (s Service) LoginWithEmailAndPassword(email, password string) (model.User, error) { | ||||
| 	return user.LoginWithEmailAndPassword(email, password) | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| // Role
 | ||||
| //
 | ||||
|  | @ -62,3 +68,24 @@ func (s Service) UpdateRole(roleID string, payload model.RoleUpdateOptions) erro | |||
| func (s Service) GetAllRoles(query model.RoleAllQuery) model.RoleAll { | ||||
| 	return role.All(query) | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| // Permission
 | ||||
| //
 | ||||
| 
 | ||||
| // permission methods
 | ||||
| 
 | ||||
| // CreatePermission ...
 | ||||
| func (s Service) CreatePermission(payload model.PermissionCreateOptions) error { | ||||
| 	return permission.Create(payload) | ||||
| } | ||||
| 
 | ||||
| // UpdatePermission ...
 | ||||
| func (s Service) UpdatePermission(permissionID string, payload model.PermissionUpdateOptions) error { | ||||
| 	return permission.Update(permissionID, payload) | ||||
| } | ||||
| 
 | ||||
| // GetAllPermissions ...
 | ||||
| func (s Service) GetAllPermissions(query model.PermissionAllQuery) model.PermissionAll { | ||||
| 	return permission.All(query) | ||||
| } | ||||
|  |  | |||
|  | @ -8,8 +8,9 @@ import ( | |||
| 
 | ||||
| // Table
 | ||||
| var ( | ||||
| 	tableUser = "users" | ||||
| 	tableRole = "roles" | ||||
| 	tableUser       = "users" | ||||
| 	tableRole       = "roles" | ||||
| 	tablePermission = "permissions" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | @ -32,3 +33,8 @@ func GetUserCol() *mongo.Collection { | |||
| func GetRoleCol() *mongo.Collection { | ||||
| 	return db.Collection(fmt.Sprintf("%s-%s", prefix, tableRole)) | ||||
| } | ||||
| 
 | ||||
| // GetPermissionCol ...
 | ||||
| func GetPermissionCol() *mongo.Collection { | ||||
| 	return db.Collection(fmt.Sprintf("%s-%s", prefix, tablePermission)) | ||||
| } | ||||
|  |  | |||
							
								
								
									
										11
									
								
								model/db.go
								
								
								
								
							
							
						
						
									
										11
									
								
								model/db.go
								
								
								
								
							|  | @ -30,3 +30,14 @@ type DBUser struct { | |||
| 	CreatedAt      time.Time          `bson:"createdAt"` | ||||
| 	UpdatedAt      time.Time          `bson:"updatedAt"` | ||||
| } | ||||
| 
 | ||||
| // DBPermission ...
 | ||||
| type DBPermission struct { | ||||
| 	ID        primitive.ObjectID `bson:"_id"` | ||||
| 	Name      string             `bson:"name"` | ||||
| 	Code      string             `bson:"code"` | ||||
| 	RoleID    primitive.ObjectID `bson:"roleId"` | ||||
| 	Desc      string             `bson:"desc"` | ||||
| 	CreatedAt time.Time          `bson:"createdAt"` | ||||
| 	UpdatedAt time.Time          `bson:"updatedAt"` | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,90 @@ | |||
| package model | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/Selly-Modules/logger" | ||||
| 	"github.com/Selly-Modules/mongodb" | ||||
| ) | ||||
| 
 | ||||
| // PermissionCreateOptions ...
 | ||||
| type PermissionCreateOptions struct { | ||||
| 	Name   string | ||||
| 	RoleID string | ||||
| 	Desc   string | ||||
| } | ||||
| 
 | ||||
| // PermissionUpdateOptions ...
 | ||||
| type PermissionUpdateOptions struct { | ||||
| 	Name   string | ||||
| 	RoleID string | ||||
| 	Desc   string | ||||
| } | ||||
| 
 | ||||
| // PermissionAllQuery ...
 | ||||
| type PermissionAllQuery struct { | ||||
| 	Page  int64 | ||||
| 	Limit int64 | ||||
| } | ||||
| 
 | ||||
| // Validate ...
 | ||||
| func (co PermissionCreateOptions) Validate() error { | ||||
| 	// Name
 | ||||
| 	if co.Name == "" { | ||||
| 		logger.Error("usermngmt - Permission - Create: no name data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no name data") | ||||
| 	} | ||||
| 
 | ||||
| 	// RoleID
 | ||||
| 	if co.RoleID == "" { | ||||
| 		logger.Error("usermngmt - Permission - Create: no roleID data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no role id data") | ||||
| 	} | ||||
| 	if _, isValid := mongodb.NewIDFromString(co.RoleID); !isValid { | ||||
| 		return errors.New("invalid role id data") | ||||
| 	} | ||||
| 
 | ||||
| 	// Desc
 | ||||
| 	if co.Desc == "" { | ||||
| 		logger.Error("usermngmt - Permission - Create: no desc data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no desc data") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Validate ...
 | ||||
| func (co PermissionUpdateOptions) Validate() error { | ||||
| 	// Name
 | ||||
| 	if co.Name == "" { | ||||
| 		logger.Error("usermngmt - Permission - Update: no name data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no name data") | ||||
| 	} | ||||
| 
 | ||||
| 	// RoleID
 | ||||
| 	if co.RoleID == "" { | ||||
| 		logger.Error("usermngmt - Permission - Update: no roleID data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no role id data") | ||||
| 	} | ||||
| 	if _, isValid := mongodb.NewIDFromString(co.RoleID); !isValid { | ||||
| 		return errors.New("invalid role id data") | ||||
| 	} | ||||
| 
 | ||||
| 	// Desc
 | ||||
| 	if co.Desc == "" { | ||||
| 		logger.Error("usermngmt - Permission - Update: no desc data", logger.LogData{ | ||||
| 			"payload": co, | ||||
| 		}) | ||||
| 		return errors.New("no desc data") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | @ -0,0 +1,24 @@ | |||
| package model | ||||
| 
 | ||||
| import ( | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Permission ...
 | ||||
| type Permission struct { | ||||
| 	ID        string    `json:"_id"` | ||||
| 	Name      string    `json:"name"` | ||||
| 	Code      string    `json:"code"` | ||||
| 	RoleID    string    `json:"roleId"` | ||||
| 	Desc      string    `json:"desc"` | ||||
| 	CreatedAt time.Time `json:"createdAt"` | ||||
| 	UpdatedAt time.Time `json:"updatedAt"` | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	// PermissionAll ...
 | ||||
| 	PermissionAll struct { | ||||
| 		List  []Permission `json:"list"` | ||||
| 		Total int64        `json:"total"` | ||||
| 	} | ||||
| ) | ||||
|  | @ -0,0 +1,97 @@ | |||
| package permission | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/Selly-Modules/logger" | ||||
| 	"github.com/Selly-Modules/usermngmt/database" | ||||
| 	"github.com/Selly-Modules/usermngmt/model" | ||||
| 	"go.mongodb.org/mongo-driver/bson" | ||||
| 	"go.mongodb.org/mongo-driver/bson/primitive" | ||||
| 	"go.mongodb.org/mongo-driver/mongo/options" | ||||
| ) | ||||
| 
 | ||||
| func findByID(ctx context.Context, id primitive.ObjectID) (model.DBPermission, error) { | ||||
| 	var ( | ||||
| 		doc model.DBPermission | ||||
| 		col = database.GetPermissionCol() | ||||
| 	) | ||||
| 	err := col.FindOne(ctx, bson.M{"_id": id}).Decode(&doc) | ||||
| 	return doc, err | ||||
| } | ||||
| 
 | ||||
| func create(ctx context.Context, doc model.DBPermission) error { | ||||
| 	var ( | ||||
| 		col = database.GetPermissionCol() | ||||
| 	) | ||||
| 	_, err := col.InsertOne(ctx, doc) | ||||
| 	if err != nil { | ||||
| 		logger.Error("usermngmt - Permission - InsertOne", logger.LogData{ | ||||
| 			"doc": doc, | ||||
| 			"err": err.Error(), | ||||
| 		}) | ||||
| 		return fmt.Errorf("error when create permission: %s", err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func updateOneByCondition(ctx context.Context, cond interface{}, payload interface{}) error { | ||||
| 	var ( | ||||
| 		col = database.GetPermissionCol() | ||||
| 	) | ||||
| 	_, err := col.UpdateOne(ctx, cond, payload) | ||||
| 	if err != nil { | ||||
| 		logger.Error("usermngmt - Permission - UpdateOne", logger.LogData{ | ||||
| 			"cond":    cond, | ||||
| 			"payload": payload, | ||||
| 			"err":     err.Error(), | ||||
| 		}) | ||||
| 		return fmt.Errorf("error when update permission: %s", err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func findByCondition(ctx context.Context, cond interface{}, opts ...*options.FindOptions) (docs []model.DBPermission) { | ||||
| 	var ( | ||||
| 		col = database.GetPermissionCol() | ||||
| 	) | ||||
| 	docs = make([]model.DBPermission, 0) | ||||
| 
 | ||||
| 	cursor, err := col.Find(ctx, cond, opts...) | ||||
| 	if err != nil { | ||||
| 		logger.Error("usermngmt - Permission - Find", logger.LogData{ | ||||
| 			"cond": cond, | ||||
| 			"opts": opts, | ||||
| 			"err":  err.Error(), | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
| 	defer cursor.Close(ctx) | ||||
| 	if err = cursor.All(ctx, &docs); err != nil { | ||||
| 		logger.Error("usermngmt - Permission - Decode", logger.LogData{ | ||||
| 			"cond": cond, | ||||
| 			"opts": opts, | ||||
| 			"err":  err.Error(), | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // countByCondition ...
 | ||||
| func countByCondition(ctx context.Context, cond interface{}) int64 { | ||||
| 	var ( | ||||
| 		col = database.GetPermissionCol() | ||||
| 	) | ||||
| 	total, err := col.CountDocuments(ctx, cond) | ||||
| 	if err != nil { | ||||
| 		logger.Error("usermngmt - Permission - CountDocuments", logger.LogData{ | ||||
| 			"err":  err.Error(), | ||||
| 			"cond": cond, | ||||
| 		}) | ||||
| 	} | ||||
| 	return total | ||||
| } | ||||
|  | @ -0,0 +1,142 @@ | |||
| package permission | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/Selly-Modules/mongodb" | ||||
| 	"github.com/Selly-Modules/usermngmt/internal" | ||||
| 	"github.com/Selly-Modules/usermngmt/model" | ||||
| 	"go.mongodb.org/mongo-driver/bson" | ||||
| ) | ||||
| 
 | ||||
| // Create ...
 | ||||
| func Create(payload model.PermissionCreateOptions) error { | ||||
| 	var ( | ||||
| 		ctx = context.Background() | ||||
| 	) | ||||
| 
 | ||||
| 	// Validate payload
 | ||||
| 	if err := payload.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// New permission data from payload
 | ||||
| 	doc := newPermission(payload) | ||||
| 
 | ||||
| 	// Create permission
 | ||||
| 	if err := create(ctx, doc); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // newPermission ...
 | ||||
| func newPermission(payload model.PermissionCreateOptions) model.DBPermission { | ||||
| 	timeNow := internal.Now() | ||||
| 	roleID, _ := mongodb.NewIDFromString(payload.RoleID) | ||||
| 	return model.DBPermission{ | ||||
| 		ID:        mongodb.NewObjectID(), | ||||
| 		Name:      payload.Name, | ||||
| 		Code:      internal.GenerateCode(payload.Name), | ||||
| 		RoleID:    roleID, | ||||
| 		Desc:      payload.Desc, | ||||
| 		CreatedAt: timeNow, | ||||
| 		UpdatedAt: timeNow, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Update ...
 | ||||
| func Update(permissionID string, payload model.PermissionUpdateOptions) error { | ||||
| 	var ( | ||||
| 		ctx = context.Background() | ||||
| 	) | ||||
| 
 | ||||
| 	// Validate payload
 | ||||
| 	if err := payload.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Validate permissionID
 | ||||
| 	id, isValid := mongodb.NewIDFromString(permissionID) | ||||
| 	if !isValid { | ||||
| 		return errors.New("invalid permission id data") | ||||
| 	} | ||||
| 
 | ||||
| 	// Setup condition
 | ||||
| 	cond := bson.M{ | ||||
| 		"_id": id, | ||||
| 	} | ||||
| 
 | ||||
| 	// Setup update data
 | ||||
| 	roleID, _ := mongodb.NewIDFromString(payload.RoleID) | ||||
| 	updateData := bson.M{ | ||||
| 		"$set": bson.M{ | ||||
| 			"name":      payload.Name, | ||||
| 			"code":      internal.GenerateCode(payload.Name), | ||||
| 			"roleId":    roleID, | ||||
| 			"desc":      payload.Desc, | ||||
| 			"updatedAt": internal.Now(), | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	// Update
 | ||||
| 	if err := updateOneByCondition(ctx, cond, updateData); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // All ...
 | ||||
| func All(queryParams model.PermissionAllQuery) (r model.PermissionAll) { | ||||
| 	var ( | ||||
| 		ctx  = context.Background() | ||||
| 		wg   sync.WaitGroup | ||||
| 		cond = bson.M{} | ||||
| 	) | ||||
| 	query := model.CommonQuery{ | ||||
| 		Page:  queryParams.Page, | ||||
| 		Limit: queryParams.Limit, | ||||
| 		Sort:  bson.M{"createdAt": -1}, | ||||
| 	} | ||||
| 
 | ||||
| 	// Assign condition
 | ||||
| 	query.SetDefaultLimit() | ||||
| 
 | ||||
| 	wg.Add(1) | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		docs := findByCondition(ctx, cond, query.GetFindOptionsUsingPage()) | ||||
| 		r.List = getResponseList(docs) | ||||
| 	}() | ||||
| 
 | ||||
| 	wg.Add(1) | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		r.Total = countByCondition(ctx, cond) | ||||
| 	}() | ||||
| 
 | ||||
| 	wg.Wait() | ||||
| 
 | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func getResponseList(permissions []model.DBPermission) []model.Permission { | ||||
| 	res := make([]model.Permission, 0) | ||||
| 	for _, permission := range permissions { | ||||
| 		res = append(res, model.Permission{ | ||||
| 			ID:        permission.ID.Hex(), | ||||
| 			Name:      permission.Name, | ||||
| 			Code:      permission.Code, | ||||
| 			RoleID:    permission.RoleID.Hex(), | ||||
| 			Desc:      permission.Desc, | ||||
| 			CreatedAt: permission.CreatedAt, | ||||
| 			UpdatedAt: permission.UpdatedAt, | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
|  | @ -166,3 +166,12 @@ func countByCondition(ctx context.Context, cond interface{}) int64 { | |||
| 	} | ||||
| 	return total | ||||
| } | ||||
| 
 | ||||
| func findOneByCondition(ctx context.Context, cond interface{}) (model.DBUser, error) { | ||||
| 	var ( | ||||
| 		col = database.GetUserCol() | ||||
| 		doc model.DBUser | ||||
| 	) | ||||
| 	err := col.FindOne(ctx, cond).Decode(&doc) | ||||
| 	return doc, err | ||||
| } | ||||
|  |  | |||
|  | @ -96,7 +96,11 @@ func All(queryParams model.UserAllQuery) (r model.UserAll) { | |||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		docs := findByCondition(ctx, cond, query.GetFindOptionsUsingPage()) | ||||
| 		r.List = getResponseList(ctx, docs) | ||||
| 		res := make([]model.User, 0) | ||||
| 		for _, doc := range docs { | ||||
| 			res = append(res, getResponse(ctx, doc)) | ||||
| 		} | ||||
| 		r.List = res | ||||
| 	}() | ||||
| 
 | ||||
| 	wg.Add(1) | ||||
|  | @ -110,29 +114,23 @@ func All(queryParams model.UserAllQuery) (r model.UserAll) { | |||
| 	return | ||||
| } | ||||
| 
 | ||||
| func getResponseList(ctx context.Context, users []model.DBUser) []model.User { | ||||
| 	res := make([]model.User, 0) | ||||
| 
 | ||||
| 	for _, user := range users { | ||||
| 		roleRaw, _ := roleFindByID(ctx, user.RoleID) | ||||
| 		res = append(res, model.User{ | ||||
| 			ID:     user.ID.Hex(), | ||||
| 			Name:   user.Name, | ||||
| 			Phone:  user.Phone, | ||||
| 			Email:  user.Email, | ||||
| 			Status: user.Status, | ||||
| 			Role: model.RoleShort{ | ||||
| 				ID:      roleRaw.ID.Hex(), | ||||
| 				Name:    roleRaw.Name, | ||||
| 				IsAdmin: roleRaw.IsAdmin, | ||||
| 			}, | ||||
| 			Other:     user.Other, | ||||
| 			CreatedAt: user.CreatedAt, | ||||
| 			UpdatedAt: user.UpdatedAt, | ||||
| 		}) | ||||
| func getResponse(ctx context.Context, user model.DBUser) model.User { | ||||
| 	roleRaw, _ := roleFindByID(ctx, user.RoleID) | ||||
| 	return model.User{ | ||||
| 		ID:     user.ID.Hex(), | ||||
| 		Name:   user.Name, | ||||
| 		Phone:  user.Phone, | ||||
| 		Email:  user.Email, | ||||
| 		Status: user.Status, | ||||
| 		Role: model.RoleShort{ | ||||
| 			ID:      roleRaw.ID.Hex(), | ||||
| 			Name:    roleRaw.Name, | ||||
| 			IsAdmin: roleRaw.IsAdmin, | ||||
| 		}, | ||||
| 		Other:     user.Other, | ||||
| 		CreatedAt: user.CreatedAt, | ||||
| 		UpdatedAt: user.UpdatedAt, | ||||
| 	} | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| // UpdateByUserID ...
 | ||||
|  | @ -290,3 +288,34 @@ func ChangeAllUsersStatus(roleID, status string) error { | |||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // LoginWithEmailAndPassword ...
 | ||||
| func LoginWithEmailAndPassword(email, password string) (result model.User, err error) { | ||||
| 	var ( | ||||
| 		ctx = context.Background() | ||||
| 	) | ||||
| 
 | ||||
| 	// Validate email, password
 | ||||
| 	if email == "" || password == "" { | ||||
| 		err = errors.New("email or password cannot be empty") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Find user
 | ||||
| 	user, _ := findOneByCondition(ctx, bson.M{ | ||||
| 		"email": email, | ||||
| 	}) | ||||
| 	if user.ID.IsZero() { | ||||
| 		err = errors.New("user not found") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Check Password
 | ||||
| 	if !internal.CheckPasswordHash(password, user.HashedPassword) { | ||||
| 		err = errors.New("the password is incorrect") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	result = getResponse(ctx, user) | ||||
| 	return | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue