server/dao/postgres/RoleBindingDAO.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
}