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.

103 lines
2.6 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
}