diff --git a/internal/data/models.go b/internal/data/models.go index 5f04826..7568e74 100644 --- a/internal/data/models.go +++ b/internal/data/models.go @@ -11,9 +11,10 @@ var ( ) type Models struct { - Movies MovieModel - Users UserModel - Tokens TokenModel + Movies MovieModel + Users UserModel + Tokens TokenModel + Permissions PermissionModel } // type Models struct { @@ -28,9 +29,10 @@ type Models struct { func NewModels(db *sql.DB) Models { return Models{ - Movies: MovieModel{DB: db}, - Users: UserModel{DB: db}, - Tokens: TokenModel{DB: db}, + Movies: MovieModel{DB: db}, + Users: UserModel{DB: db}, + Tokens: TokenModel{DB: db}, + Permissions: PermissionModel{DB: db}, } } diff --git a/internal/data/permissions.go b/internal/data/permissions.go new file mode 100644 index 0000000..571473f --- /dev/null +++ b/internal/data/permissions.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + "database/sql" + "time" +) + +type Permissions []string + +func (p Permissions) Include(code string) bool { + for i := range p { + if code == p[i] { + return true + } + } + return false +} + +type PermissionModel struct { + DB *sql.DB +} + +func (m PermissionModel) GetAllForUser(userID int64) (Permissions, error) { + query := ` + SELECT permissions.code + FROM permissions + INNER JOIN users_permissions ON users_permissions.permission_id = permissions.id + INNER JOIN users ON users_permissions.user_id = users.id + WHERE users.id = $1` + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + rows, err := m.DB.QueryContext(ctx, query, userID) + if err != nil { + return nil, err + } + defer rows.Close() + + var permissions Permissions + + for rows.Next() { + var permission string + + err := rows.Scan(&permission) + if err != nil { + return nil, err + } + permissions = append(permissions, permission) + } + + if err = rows.Err(); err != nil { + return nil, err + } + + return permissions, nil +}