github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/entrepository/role.go (about)

     1  package entrepository
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	e "github.com/ngocphuongnb/tetua/app/entities"
     8  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent"
     9  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/role"
    10  )
    11  
    12  type RoleRepository struct {
    13  	*BaseRepository[e.Role, ent.Role, *ent.RoleQuery, *e.RoleFilter]
    14  }
    15  
    16  func (p *RoleRepository) ByName(ctx context.Context, name string) (*e.Role, error) {
    17  	r, err := p.Client.Role.Query().Where(role.NameEQ(name)).Only(ctx)
    18  	if err != nil {
    19  		return nil, EntError(err, fmt.Sprintf("role not found with name: %s", name))
    20  	}
    21  	return entRoleToRole(r), err
    22  }
    23  
    24  func (p *RoleRepository) SetPermissions(ctx context.Context, id int, permissions []*e.PermissionValue) error {
    25  	var builders []*ent.PermissionCreate
    26  
    27  	for _, permission := range permissions {
    28  		us := p.Client.Permission.
    29  			Create().
    30  			SetRoleID(id).
    31  			SetAction(permission.Action).
    32  			SetValue(string(permission.Value))
    33  		builders = append(builders, us)
    34  	}
    35  
    36  	return p.Client.Permission.
    37  		CreateBulk(builders...).
    38  		OnConflict().
    39  		UpdateNewValues().
    40  		Exec(ctx)
    41  }
    42  
    43  func CreateRoleRepository(client *ent.Client) *RoleRepository {
    44  	return &RoleRepository{
    45  		BaseRepository: &BaseRepository[e.Role, ent.Role, *ent.RoleQuery, *e.RoleFilter]{
    46  			Name:      "role",
    47  			Client:    client,
    48  			ConvertFn: entRoleToRole,
    49  			ByIDFn: func(ctx context.Context, client *ent.Client, id int) (*ent.Role, error) {
    50  				return client.Role.Query().WithPermissions().Where(role.IDEQ(id)).Only(ctx)
    51  			},
    52  			DeleteByIDFn: func(ctx context.Context, client *ent.Client, id int) error {
    53  				return client.Role.DeleteOneID(id).Exec(ctx)
    54  			},
    55  			CreateFn: func(ctx context.Context, client *ent.Client, data *e.Role) (*ent.Role, error) {
    56  				return client.Role.Create().
    57  					SetName(data.Name).
    58  					SetDescription(data.Description).
    59  					SetRoot(data.Root).
    60  					Save(ctx)
    61  			},
    62  			UpdateFn: func(ctx context.Context, client *ent.Client, data *e.Role) (*ent.Role, error) {
    63  				return client.Role.UpdateOneID(data.ID).
    64  					SetName(data.Name).
    65  					SetDescription(data.Description).
    66  					SetRoot(data.Root).
    67  					Save(ctx)
    68  			},
    69  			QueryFilterFn: func(client *ent.Client, filters ...*e.RoleFilter) *ent.RoleQuery {
    70  				query := client.Role.Query().WithPermissions()
    71  
    72  				if len(filters) > 0 && filters[0].Search != "" {
    73  					query = query.Where(role.NameContainsFold(filters[0].Search))
    74  				}
    75  
    76  				return query
    77  			},
    78  			FindFn: func(ctx context.Context, query *ent.RoleQuery, filters ...*e.RoleFilter) ([]*ent.Role, error) {
    79  				page, limit, sorts := getPaginateParams(filters...)
    80  				return query.
    81  					WithPermissions().
    82  					Limit(limit).
    83  					Offset((page - 1) * limit).
    84  					Order(sorts...).All(ctx)
    85  			},
    86  		},
    87  	}
    88  }