132 lines
2.8 KiB
Go
132 lines
2.8 KiB
Go
package postgres
|
|
|
|
import (
|
|
"git.tek.govt.hu/dowerx/chat/server/model"
|
|
"git.tek.govt.hu/dowerx/chat/server/util"
|
|
)
|
|
|
|
type RoleBindingDAOPG struct {
|
|
pgDAO
|
|
}
|
|
|
|
// Bind creates a new RoleBinding.
|
|
//
|
|
// It uses name only if ID is not set.
|
|
func (d RoleBindingDAOPG) Bind(role model.Role, user model.User) *util.ChatError {
|
|
if role.ID != 0 {
|
|
role.Name = ""
|
|
}
|
|
|
|
if user.ID != 0 {
|
|
user.Username = ""
|
|
}
|
|
_, err := d.db.Exec(
|
|
`insert into "role" ("role_id", "user_id") values (
|
|
(select "id" from "role" where "id" = $1 or "name" = $2),
|
|
(select "id" from "user" where "id" = $3 or "username" = $4))`,
|
|
role.ID, role.Name,
|
|
user.ID, user.Username)
|
|
|
|
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
// Unbind deletes a RoleBinding.
|
|
//
|
|
// It uses name only if ID is not set.
|
|
func (d RoleBindingDAOPG) Unbind(role model.Role, user model.User) *util.ChatError {
|
|
if role.ID != 0 {
|
|
role.Name = ""
|
|
}
|
|
|
|
if user.ID != 0 {
|
|
user.Username = ""
|
|
}
|
|
_, err := d.db.Exec(
|
|
`delete from "role"
|
|
where
|
|
"role_id" = (select "id" from "role" where "id" = $1 or "name" = $2)
|
|
and
|
|
"user_id" = (select "id" from "user" where "id" = $3 or "username" = $4)`,
|
|
role.ID, role.Name,
|
|
user.ID, user.Username)
|
|
|
|
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
func (d RoleBindingDAOPG) ListRolesOfUser(user model.User) ([]model.Role, *util.ChatError) {
|
|
if user.ID != 0 {
|
|
user.Username = ""
|
|
}
|
|
|
|
rows, err := d.db.NamedQuery(
|
|
`select
|
|
"r"."id" as "id",
|
|
"r"."name" as "name"
|
|
from "role_binding" "rb"
|
|
join "role" "r" on "r"."id" = "rb"."role_id"
|
|
where "user_id" = (select "id" from "user" where "id" = :id or "username" = :username)`,
|
|
&user)
|
|
|
|
if err != nil {
|
|
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
var roles []model.Role
|
|
|
|
for rows.Next() {
|
|
role := model.Role{}
|
|
err = rows.Scan(&role)
|
|
|
|
if err != nil {
|
|
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
roles = append(roles, role)
|
|
}
|
|
|
|
return roles, nil
|
|
}
|
|
|
|
func (d RoleBindingDAOPG) ListUserWithRole(role model.Role) ([]model.User, *util.ChatError) {
|
|
if role.ID != 0 {
|
|
role.Name = ""
|
|
}
|
|
|
|
rows, err := d.db.NamedQuery(
|
|
`select
|
|
"u".*
|
|
from "user" "u"
|
|
join "role_binding" "rb" on "rb"."user_id" = "u"."id"
|
|
where "rb"."role_id" = (select "id" from "role" where "id" = :id or "name" = :name)`,
|
|
&role)
|
|
|
|
if err != nil {
|
|
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
var users []model.User
|
|
for rows.Next() {
|
|
user := model.User{}
|
|
err = rows.Scan(&user)
|
|
|
|
if err != nil {
|
|
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
users = append(users, user)
|
|
}
|
|
|
|
return users, nil
|
|
}
|
|
|
|
func MakeRoleBindingDAO() (RoleBindingDAOPG, *util.ChatError) {
|
|
dao := RoleBindingDAOPG{}
|
|
conn, err := getDatabase()
|
|
if err != nil {
|
|
return dao, err
|
|
}
|
|
|
|
dao.db = conn
|
|
return dao, nil
|
|
}
|