Files
wehub-resource-sync a21fa4e11b
Go / Build (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:30:21 +08:00

758 lines
20 KiB
Go

package models
import (
"fmt"
"github.com/astaxie/beego/logs"
"github.com/phachon/mm-wiki/app/utils"
"github.com/snail007/go-activerecord/mysql"
"strconv"
"strings"
"time"
)
const (
Document_Delete_True = 1
Document_Delete_False = 0
Document_Type_Page = 1
Document_Type_Dir = 2
)
const Table_Document_Name = "document"
type Document struct {
}
var DocumentModel = Document{}
// get document by document_id
func (d *Document) GetDocumentByDocumentId(documentId string) (document map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"document_id": documentId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
document = rs.Row()
return
}
// get documents by parent_id
func (d *Document) GetDocumentsByParentId(parentId string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"parent_id": parentId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document by name
func (d *Document) GetDocumentsByName(name string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"name": name,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document by name and spaceId
func (d *Document) GetDocumentByNameAndSpaceId(name string, spaceId string) (document map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"name": name,
"space_id": spaceId,
"is_delete": Document_Delete_False,
}).Limit(0, 1))
if err != nil {
return
}
document = rs.Row()
return
}
// get document by name and spaceId
func (d *Document) GetDocumentByNameParentIdAndSpaceId(name string, parentId string, spaceId string, docType int) (document map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"name": name,
"space_id": spaceId,
"parent_id": parentId,
"type": docType,
"is_delete": Document_Delete_False,
}).Limit(0, 1))
if err != nil {
return
}
document = rs.Row()
return
}
// get document by name and spaceId
func (d *Document) GetDocumentByParentIdAndSpaceId(parentId string, spaceId string, docType int) (document map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id": parentId,
"type": docType,
"is_delete": Document_Delete_False,
}).Limit(0, 1))
if err != nil {
return
}
document = rs.Row()
return
}
// get document by name and spaceId
func (d *Document) GetDocumentsByParentIdAndSpaceIdOnly(parentId string, spaceId string) (document []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id": parentId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
document = rs.Rows()
return
}
// get max sequence
func (d *Document) GetDocumentMaxSequence(parentId string, spaceId string) (sequence int, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id": parentId,
}).OrderBy("sequence", "desc").Limit(0, 1))
if err != nil {
return
}
document := rs.Row()
sequenceStr := document["sequence"]
sequence, err = strconv.Atoi(sequenceStr)
return
}
// delete document by document_id
func (d *Document) DeleteDBAndFile(documentId string, spaceId string, userId string, pageFile string, docType string) (err error) {
db := G.DB()
tx, err := db.Begin(db.Config)
if err != nil {
return
}
_, err = db.ExecTx(db.AR().Update(Table_Document_Name, map[string]interface{}{
"is_delete": Document_Delete_True,
"update_time": time.Now().Unix(),
"edit_user_id": userId,
}, map[string]interface{}{
"document_id": documentId,
}), tx)
if err != nil {
tx.Rollback()
return
}
// delete document file
err = utils.Document.Delete(pageFile, utils.Convert.StringToInt(docType))
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
if err != nil {
return
}
// create document log
go func(userId, documentId string, spaceId string) {
_, err := LogDocumentModel.DeleteAction(userId, documentId, spaceId)
if err != nil {
logs.Error("delete document add log err=%s", err.Error())
}
}(userId, documentId, spaceId)
// delete follow doc
go func(documentId string) {
err := FollowModel.DeleteByObjectIdType(documentId, fmt.Sprintf("%d", Follow_Type_Doc))
if err != nil {
logs.Error("delete follow document err=%s", err.Error())
}
}(documentId)
// delete collect doc
go func(documentId string) {
err := CollectionModel.DeleteByResourceIdType(documentId, fmt.Sprintf("%d", Collection_Type_Doc))
if err != nil {
logs.Error("delete collect document err=%s", err.Error())
}
}(documentId)
return
}
// insert document
func (d *Document) Insert(documentValue map[string]interface{}) (id int64, err error) {
db := G.DB()
// start db begin
tx, err := db.Begin(db.Config)
if err != nil {
return
}
// 处理同级排序编号
parentId := documentValue["parent_id"].(string)
spaceId := documentValue["space_id"].(string)
sequence, err := d.GetDocumentMaxSequence(parentId, spaceId)
if err != nil {
sequence = 0
}
sequence += 1
documentValue["sequence"] = strconv.Itoa(sequence)
var rs *mysql.ResultSet
documentValue["create_time"] = time.Now().Unix()
documentValue["update_time"] = time.Now().Unix()
rs, err = db.ExecTx(db.AR().Insert(Table_Document_Name, documentValue), tx)
if err != nil {
tx.Rollback()
return
}
id = rs.LastInsertId
// create document page file
document := map[string]string{
"space_id": documentValue["space_id"].(string),
"parent_id": documentValue["parent_id"].(string),
"name": documentValue["name"].(string),
"type": fmt.Sprintf("%d", documentValue["type"].(int)),
"path": documentValue["path"].(string),
}
_, pageFile, err := d.GetParentDocumentsByDocument(document)
err = utils.Document.Create(pageFile)
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
if err != nil {
return
}
userId := documentValue["create_user_id"].(string)
// create document log
go func(userId, documentId, spaceId string) {
_, err := LogDocumentModel.CreateAction(userId, documentId, spaceId)
if err != nil {
logs.Error("create document add log err=%s", err.Error())
}
}(userId, fmt.Sprintf("%d", id), spaceId)
// follow document
go func(userId, documentId string) {
_, err := FollowModel.CreateAutoFollowDocument(userId, documentId)
if err != nil {
logs.Error("follow document err=%s", err.Error())
}
}(userId, fmt.Sprintf("%d", id))
return
}
// update document by document_id
func (d *Document) Update(documentId string, documentValue map[string]interface{}, comment string, spaceId string) (id int64, err error) {
db := G.DB()
var rs *mysql.ResultSet
documentValue["update_time"] = time.Now().Unix()
rs, err = db.Exec(db.AR().Update(Table_Document_Name, documentValue, map[string]interface{}{
"document_id": documentId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
id = rs.LastInsertId
// update document log
go func(editUserId string, documentId string, comment string, spaceId string) {
_, err := LogDocumentModel.UpdateAction(editUserId, documentId, comment, spaceId)
if err != nil {
logs.Error("update document add log err=%s", err.Error())
}
}(documentValue["edit_user_id"].(string), documentId, comment, spaceId)
// follow document
go func(editUserId string, documentId string) {
_, err := FollowModel.CreateAutoFollowDocument(editUserId, documentId)
if err != nil {
logs.Error("follow document err=%s", err.Error())
}
}(documentValue["edit_user_id"].(string), documentId)
return
}
// update document by spaceId and >= sequence
// 批量移动更新文档序号
func (d *Document) MoveSequenceBySpaceIdAndGtSequence(spaceId string, startSequence int, n int) (id int64, err error) {
db := G.DB()
var rs *mysql.ResultSet
//documentValue := map[string]interface{}{
// "sequence": fmt.Sprintf("(sequence+%d)", n),
// "update_time": time.Now().Unix(),
//}
updateTime := time.Now().Unix()
sql := fmt.Sprintf(
"update mw_%s set sequence=sequence+%d, update_time=%d where space_id=%s and sequence >= %d and is_delete=%d",
Table_Document_Name, n, updateTime, spaceId, startSequence, Document_Delete_False,
)
rs, err = db.ExecSQL(sql)
if err != nil {
logs.Error(err.Error())
return
}
id = rs.LastInsertId
return
}
// move document
func (d *Document) MoveDBAndFile(documentId string, spaceId string, updateValue map[string]interface{},
oldPageFile string, newPageFile string, docType string, comment string) (id int64, err error) {
db := G.DB()
tx, err := db.Begin(db.Config)
if err != nil {
return
}
var rs *mysql.ResultSet
updateValue["update_time"] = time.Now().Unix()
rs, err = db.ExecTx(db.AR().Update(Table_Document_Name, updateValue, map[string]interface{}{
"document_id": documentId,
"is_delete": Document_Delete_False,
}), tx)
if err != nil {
tx.Rollback()
return
}
id = rs.LastInsertId
err = utils.Document.Move(oldPageFile, newPageFile, utils.Convert.StringToInt(docType))
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
if err != nil {
return
}
// create document log
go func(userId, documentId, comment string, spaceId string) {
_, err := LogDocumentModel.UpdateAction(updateValue["edit_user_id"].(string), documentId, comment, spaceId)
if err != nil {
logs.Error("update document add log err=%s", err.Error())
}
}(updateValue["edit_user_id"].(string), documentId, comment, spaceId)
return
}
// update document by document_id
func (d *Document) UpdateDBAndFile(documentId string, spaceId string, document map[string]string, documentContent string, updateValue map[string]interface{}, comment string) (id int64, err error) {
// get document page file
_, oldPageFile, err := DocumentModel.GetParentDocumentsByDocument(document)
if err != nil {
return
}
// begin update
db := G.DB()
tx, err := db.Begin(db.Config)
if err != nil {
return
}
var rs *mysql.ResultSet
updateValue["update_time"] = time.Now().Unix()
rs, err = db.ExecTx(db.AR().Update(Table_Document_Name, updateValue, map[string]interface{}{
"document_id": documentId,
"is_delete": Document_Delete_False,
}), tx)
if err != nil {
tx.Rollback()
return
}
id = rs.LastInsertId
// update document file
docType := utils.Convert.StringToInt(document["type"])
nameIsChange := false
if updateValue["name"].(string) != document["name"] {
nameIsChange = true
}
err = utils.Document.Update(oldPageFile, updateValue["name"].(string), documentContent, docType, nameIsChange)
if err != nil {
tx.Rollback()
return
}
// commit
err = tx.Commit()
if err != nil {
return
}
// create document log
go func(documentId string, comment string, spaceId string) {
_, _ = LogDocumentModel.UpdateAction(updateValue["edit_user_id"].(string), documentId, comment, spaceId)
}(documentId, comment, spaceId)
// create follow doc
go func(documentId string) {
_, _ = FollowModel.CreateAutoFollowDocument(updateValue["edit_user_id"].(string), documentId)
}(documentId)
return
}
// get all documents
func (d *Document) GetDocumentsBySpaceId(spaceId string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document by spaceId and parentId
func (d *Document) GetDocumentsBySpaceIdAndParentId(spaceId string, parentId string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id": parentId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document by spaceId
func (d *Document) GetSpaceDefaultDocument(spaceId string) (document map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id": "0",
"is_delete": Document_Delete_False,
}).Limit(0, 1))
if err != nil {
return
}
document = rs.Row()
return
}
// get document by spaceId
func (d *Document) GetAllSpaceDocuments(spaceId string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"space_id": spaceId,
"parent_id >": "0",
"is_delete": Document_Delete_False,
}).OrderBy("sequence", "ASC"))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document count
func (d *Document) CountDocumentsBySpaceId(spaceId string) (count int64, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().
Select("count(*) as total").
From(Table_Document_Name).
Where(map[string]interface{}{
"space_id": spaceId,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
count = utils.NewConvert().StringToInt64(rs.Value("total"))
return
}
// get document count
func (d *Document) CountDocuments() (count int64, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().
Select("count(*) as total").
From(Table_Document_Name).
Where(map[string]interface{}{
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
count = utils.NewConvert().StringToInt64(rs.Value("total"))
return
}
// get document by name
func (d *Document) GetDocumentsByLikeName(name string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"name Like": "%" + name + "%",
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
// get document link name and limit
func (d *Document) GetDocumentsByLikeNameAndLimit(name string, limit int, number int) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"name Like": "%" + name + "%",
"is_delete": Document_Delete_False,
}).Limit(limit, number))
if err != nil {
return
}
documents = rs.Rows()
return
}
// count document like name
func (d *Document) CountDocumentsLikeName(name string) (count int64, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(
db.AR().
Select("count(*) as total").
From(Table_Document_Name).
Where(map[string]interface{}{
"name Like": "%" + name + "%",
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
count = utils.Convert.StringToInt64(rs.Value("total"))
return
}
// get document by spaceId and document_ids
func (d *Document) GetDocumentsByDocumentIds(documentIds []string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"document_id": documentIds,
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetAllDocumentsByDocumentIds(documentIds []string) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"document_id": documentIds,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetAllDocuments() (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
rs, err = db.Query(db.AR().From(Table_Document_Name).Where(map[string]interface{}{
"is_delete": Document_Delete_False,
}))
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetParentDocumentsByDocument(document map[string]string) (parentDocuments []map[string]string, pageFile string, err error) {
if document["parent_id"] == "0" {
parentDocuments = append(parentDocuments, document)
pageFile = utils.Document.GetDefaultPageFileBySpaceName(document["name"])
} else {
documentsIds := strings.Split(document["path"], ",")
parentDocuments, err = d.GetDocumentsByDocumentIds(documentsIds)
if err != nil {
return
}
var parentPath = ""
for _, parentDocument := range parentDocuments {
parentPath += parentDocument["name"] + "/"
}
parentPath = strings.TrimRight(parentPath, "/")
pageFile = utils.Document.GetPageFileByParentPath(document["name"], utils.Convert.StringToInt(document["type"]), parentPath)
}
return
}
func (d *Document) GetParentDocumentsByPath(path string) (parentDocuments []map[string]string, err error) {
documentsIds := strings.Split(path, ",")
parentDocuments, err = d.GetDocumentsByDocumentIds(documentsIds)
if err != nil {
return
}
return
}
func (d *Document) GetSpaceIdsOrderByCountDocumentLimit(limit int) (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
sql := db.AR().Select("space_id, count('space_id') as total").
From(Table_Document_Name).Where(map[string]interface{}{
"is_delete": Document_Delete_False,
}).
GroupBy("space_id").
OrderBy("total", "DESC").
Limit(0, limit)
rs, err = db.Query(sql)
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetCountGroupByCreateTime(startTime int64) (documents []map[string]string, err error) {
/*select month(FROM_UNIXTIME(time)) from table_name group by month(FROM_UNIXTIME(time))*/
/*select DATE_FORMAT(FROM_UNIXTIME(time),"%Y-%m") from tcm_fund_list group by DATE_FORMAT(FROM_UNIXTIME(time),"%Y-%m")*/
/*select FROM_UNIXTIME(time,"%Y-%m") from tcm_fund_list group by FROM_UNIXTIME(time,"%Y-%m")*/
/*select DATE_FORMAT(FROM_UNIXTIME(time),"%Y-%m-%d") from tcm_fund_list group by DATE_FORMAT(FROM_UNIXTIME(time),"%Y-%m-%d")*/
db := G.DB()
var rs *mysql.ResultSet
sql := db.AR().Select("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d') as date, count('date') as total").
From(Table_Document_Name).Where(map[string]interface{}{
"is_delete": Document_Delete_False,
"create_time >=": startTime,
}).GroupBy("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d')")
rs, err = db.Query(sql)
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetDocumentGroupCreateUserId() (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
sql := db.AR().Select("create_user_id, count('create_user_id') as total").
From(Table_Document_Name).Where(map[string]interface{}{
"is_delete": Document_Delete_False,
}).GroupBy("create_user_id")
rs, err = db.Query(sql)
if err != nil {
return
}
documents = rs.Rows()
return
}
func (d *Document) GetDocumentGroupEditUserId() (documents []map[string]string, err error) {
db := G.DB()
var rs *mysql.ResultSet
sql := db.AR().Select("edit_user_id, count('edit_user_id') as total").
From(Table_Document_Name).Where(map[string]interface{}{
"is_delete": Document_Delete_False,
}).GroupBy("edit_user_id")
rs, err = db.Query(sql)
if err != nil {
return
}
documents = rs.Rows()
return
}
// 根据文档信息获取文档内容和文件地址
func (d *Document) GetDocumentContentByDocument(doc map[string]string) (content string, pageFile string, err error) {
// get document page file
_, pageFile, err = DocumentModel.GetParentDocumentsByDocument(doc)
if err != nil {
return content, pageFile, err
}
// get document content
content, err = utils.Document.GetContentByPageFile(pageFile)
if err != nil {
return content, pageFile, err
}
return content, pageFile, nil
}