mirror of https://github.com/sunface/rust-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.9 KiB
114 lines
2.9 KiB
package org
|
|
|
|
import (
|
|
"database/sql"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/imdotdev/im.dev/server/internal/interaction"
|
|
"github.com/imdotdev/im.dev/server/pkg/db"
|
|
"github.com/imdotdev/im.dev/server/pkg/e"
|
|
"github.com/imdotdev/im.dev/server/pkg/log"
|
|
"github.com/imdotdev/im.dev/server/pkg/models"
|
|
"github.com/imdotdev/im.dev/server/pkg/utils"
|
|
)
|
|
|
|
var logger = log.RootLogger.New("logger", "org")
|
|
|
|
func GetOrgByUserID(userID string) ([]*models.User, *e.Error) {
|
|
orgs := make([]*models.User, 0)
|
|
|
|
rows, err := db.Conn.Query("SELECT org_id,role FROM org_member WHERE user_id=?", userID)
|
|
if err != nil {
|
|
logger.Warn("get user orgs error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
for rows.Next() {
|
|
var oid, role string
|
|
rows.Scan(&oid, &role)
|
|
|
|
org, ok := models.UsersMapCache[oid]
|
|
if ok {
|
|
org.Role = models.RoleType(role)
|
|
orgs = append(orgs, org)
|
|
}
|
|
}
|
|
|
|
return orgs, nil
|
|
}
|
|
|
|
func Create(o *models.User, userID string) *e.Error {
|
|
o.ID = utils.GenID(models.IDTypeOrg)
|
|
|
|
tx, err := db.Conn.Begin()
|
|
if err != nil {
|
|
logger.Warn("start sql transaction error", "error", err)
|
|
return e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
now := time.Now()
|
|
_, err = tx.Exec("INSERT INTO user (id,type,username,nickname,created,updated) VALUES (?,?,?,?,?,?)", o.ID, models.IDTypeOrg, o.Username, o.Nickname, now, now)
|
|
if err != nil {
|
|
logger.Warn("add org error", "error", err)
|
|
return e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
_, err = tx.Exec("INSERT INTO org_member (org_id,user_id,role,created) VALUES (?,?,?,?)", o.ID, userID, models.ROLE_ADMIN, now)
|
|
if err != nil {
|
|
logger.Warn("add org member error", "error", err)
|
|
tx.Rollback()
|
|
return e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
tx.Commit()
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetMembers(user *models.User, orgID string) ([]*models.User, *e.Error) {
|
|
rows, err := db.Conn.Query("SELECT user_id from org_member where org_id=?", orgID)
|
|
if err != nil {
|
|
logger.Warn("get org members error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
users := make([]*models.User, 0)
|
|
for rows.Next() {
|
|
var id string
|
|
rows.Scan(&id)
|
|
|
|
u, ok := models.UsersMapCache[id]
|
|
if ok {
|
|
users = append(users, u)
|
|
if user != nil {
|
|
u.Followed = interaction.GetFollowed(u.ID, user.ID)
|
|
u.Follows = interaction.GetFollows(u.ID)
|
|
}
|
|
}
|
|
}
|
|
|
|
return users, nil
|
|
}
|
|
|
|
func GetMemberCount(orgID string) int {
|
|
var count int
|
|
err := db.Conn.QueryRow("SELECT count(*) FROM org_member WHERE org_id=?", orgID).Scan(&count)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
logger.Warn("get org member count error", "error", err)
|
|
}
|
|
|
|
return count
|
|
}
|
|
|
|
func IsOrgAdmin(userID string, orgID string) bool {
|
|
var role models.RoleType
|
|
err := db.Conn.QueryRow("SELECT role FROM org_member WHERE org_id=? and user_id=?", orgID, userID).Scan(&role)
|
|
if err != nil {
|
|
logger.Warn("check is org admin error", "error", err)
|
|
return false
|
|
}
|
|
|
|
return role.IsAdmin()
|
|
}
|