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 }