mindoc/models/Relationship.go

198 lines
4.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package models
import (
"errors"
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs"
"github.com/mindoc-org/mindoc/conf"
)
type Relationship struct {
RelationshipId int `orm:"pk;auto;unique;column(relationship_id)" json:"relationship_id"`
MemberId int `orm:"column(member_id);type(int);description(作者id)" json:"member_id"`
BookId int `orm:"column(book_id);type(int);description(所属项目id)" json:"book_id"`
// RoleId 角色0 创始人(创始人不能被移除) / 1 管理员/2 编辑者/3 观察者
RoleId conf.BookRole `orm:"column(role_id);type(int);description(角色-配置文件里写死0 创始人-不能被移除 / 1 管理员/2 编辑者/3 观察者)" json:"role_id"`
}
// TableName 获取对应数据库表名. 用户和项目的关联表
func (m *Relationship) TableName() string {
return "relationship"
}
func (m *Relationship) TableNameWithPrefix() string {
return conf.GetDatabasePrefix() + m.TableName()
}
// TableEngine 获取数据使用的引擎.
func (m *Relationship) TableEngine() string {
return "INNODB"
}
// 联合唯一键
func (m *Relationship) TableUnique() [][]string {
return [][]string{
{"member_id", "book_id"},
}
}
func (m *Relationship) QueryTable() orm.QuerySeter {
return orm.NewOrm().QueryTable(m.TableNameWithPrefix())
}
func NewRelationship() *Relationship {
return &Relationship{}
}
func (m *Relationship) Find(id int) (*Relationship, error) {
o := orm.NewOrm()
err := o.QueryTable(m.TableNameWithPrefix()).Filter("relationship_id", id).One(m)
return m, err
}
//查询指定项目的创始人.
func (m *Relationship) FindFounder(book_id int) (*Relationship, error) {
o := orm.NewOrm()
err := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id", book_id).Filter("role_id", 0).One(m)
return m, err
}
func (m *Relationship) UpdateRoleId(bookId, memberId int, roleId conf.BookRole) (*Relationship, error) {
o := orm.NewOrm()
book := NewBook()
book.BookId = bookId
if err := o.Read(book); err != nil {
logs.Error("UpdateRoleId => ", err)
return m, errors.New("项目不存在")
}
err := o.QueryTable(m.TableNameWithPrefix()).Filter("member_id", memberId).Filter("book_id", bookId).One(m)
if err == orm.ErrNoRows {
m = NewRelationship()
m.BookId = bookId
m.MemberId = memberId
m.RoleId = roleId
} else if err != nil {
return m, err
} else if m.RoleId == conf.BookFounder {
return m, errors.New("不能变更创始人的权限")
}
m.RoleId = roleId
if m.RelationshipId > 0 {
_, err = o.Update(m)
} else {
_, err = o.Insert(m)
}
return m, err
}
func (m *Relationship) FindForRoleId(bookId, memberId int) (conf.BookRole, error) {
o := orm.NewOrm()
relationship := NewRelationship()
err := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id", bookId).Filter("member_id", memberId).One(relationship)
if err != nil {
return conf.BookRoleNoSpecific, err
}
return relationship.RoleId, nil
}
func (m *Relationship) FindByBookIdAndMemberId(book_id, member_id int) (*Relationship, error) {
o := orm.NewOrm()
err := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id", book_id).Filter("member_id", member_id).One(m)
return m, err
}
func (m *Relationship) Insert() error {
o := orm.NewOrm()
_, err := o.Insert(m)
return err
}
func (m *Relationship) Update(txOrm orm.TxOrmer) error {
_, err := txOrm.Update(m)
if err != nil {
txOrm.Rollback()
}
return err
}
func (m *Relationship) DeleteByBookIdAndMemberId(book_id, member_id int) error {
o := orm.NewOrm()
err := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id", book_id).Filter("member_id", member_id).One(m)
if err == orm.ErrNoRows {
return errors.New("用户未参与该项目")
}
if m.RoleId == conf.BookFounder {
return errors.New("不能删除创始人")
}
_, err = o.Delete(m)
if err != nil {
logs.Error("删除项目参与者 => ", err)
return errors.New("删除失败")
}
return nil
}
func (m *Relationship) Transfer(book_id, founder_id, receive_id int) error {
ormer := orm.NewOrm()
founder := NewRelationship()
err := ormer.QueryTable(m.TableNameWithPrefix()).Filter("book_id", book_id).Filter("member_id", founder_id).One(founder)
if err != nil {
return err
}
if founder.RoleId != conf.BookFounder {
return errors.New("转让者不是创始人")
}
receive := NewRelationship()
err = ormer.QueryTable(m.TableNameWithPrefix()).Filter("book_id", book_id).Filter("member_id", receive_id).One(receive)
if err != orm.ErrNoRows && err != nil {
return err
}
o, _ := ormer.Begin()
founder.RoleId = conf.BookAdmin
receive.MemberId = receive_id
receive.RoleId = conf.BookFounder
receive.BookId = book_id
if err := founder.Update(o); err != nil {
return err
}
if receive.RelationshipId > 0 {
if _, err := o.Update(receive); err != nil {
o.Rollback()
return err
}
} else {
if _, err := o.Insert(receive); err != nil {
o.Rollback()
return err
}
}
return o.Commit()
}