2023-08-31 08:17:32 +00:00
package logic
import (
2023-09-01 07:05:42 +00:00
"encoding/json"
2023-08-31 08:17:32 +00:00
"fmt"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
2023-09-01 02:48:00 +00:00
"fusenapi/utils/check"
2023-08-31 08:17:32 +00:00
"strings"
"context"
"fusenapi/server/info/internal/svc"
"fusenapi/server/info/internal/types"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type InfoLogic struct {
logx . Logger
ctx context . Context
svcCtx * svc . ServiceContext
}
func NewInfoLogic ( ctx context . Context , svcCtx * svc . ServiceContext ) * InfoLogic {
return & InfoLogic {
Logger : logx . WithContext ( ctx ) ,
ctx : ctx ,
svcCtx : svcCtx ,
}
}
// 处理进入前逻辑w,r
// func (l *InfoLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
// 这个与表名强关联
var ModuleTable map [ string ] string = map [ string ] string {
"userinfo" : "fs_user_info" ,
"material" : "fs_user_material" ,
}
2023-09-01 02:48:00 +00:00
type ModuleQuery struct {
2023-09-01 05:30:34 +00:00
TableName string
2023-09-01 02:48:00 +00:00
ModuleName string
2023-09-01 04:22:05 +00:00
ModuleQuery map [ string ] struct { }
}
func ( mquery * ModuleQuery ) EncodeQuery ( field string ) string {
var qstr [ ] byte = [ ] byte ( "JSON_OBJECT(" )
for query := range mquery . ModuleQuery {
2023-09-01 05:28:35 +00:00
qstr = append ( qstr , [ ] byte ( fmt . Sprintf ( "'%s.%s',%s ->> '$.%s'," , mquery . ModuleName , query , field , query ) ) ... )
2023-09-01 04:22:05 +00:00
}
if qstr [ len ( qstr ) - 1 ] == ',' {
qstr [ len ( qstr ) - 1 ] = ')'
} else {
qstr = append ( qstr , ')' )
}
return string ( qstr )
2023-09-01 02:48:00 +00:00
}
2023-08-31 08:17:32 +00:00
func ( l * InfoLogic ) Info ( req * types . UserInfoRequest , userinfo * auth . UserInfo ) ( resp * basic . Response ) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null
var cond string
switch userinfo . GetIdType ( ) {
case auth . IDTYPE_User :
cond = fmt . Sprintf ( "user_id = %d" , userinfo . UserId )
case auth . IDTYPE_Guest :
cond = fmt . Sprintf ( "guest_id = %d" , userinfo . GuestId )
default :
cond = "user_id = 0 and guest_id = 0"
}
2023-09-01 04:22:05 +00:00
var mquerys map [ string ] * ModuleQuery = make ( map [ string ] * ModuleQuery )
2023-08-31 08:17:32 +00:00
var metadict map [ string ] any = make ( map [ string ] any )
for _ , module := range req . Module {
2023-09-01 02:48:00 +00:00
if ! check . CheckModuleQuery ( module ) {
return resp . SetStatusWithMessage ( basic . CodeApiErr , fmt . Sprintf ( "%s format is error" , module ) )
}
2023-08-31 08:17:32 +00:00
mlist := strings . Split ( module , "." )
2023-09-01 07:58:03 +00:00
if len ( mlist ) < 2 {
2023-08-31 08:17:32 +00:00
return resp . SetStatusWithMessage ( basic . CodeApiErr , fmt . Sprintf ( "%s format error" , module ) )
}
mtable := mlist [ 0 ]
tname , ok := ModuleTable [ mtable ]
if ! ok {
return resp . SetStatusWithMessage ( basic . CodeApiErr , fmt . Sprintf ( "%s format error, table %s not found" , module , tname ) )
}
2023-09-01 07:58:03 +00:00
moduleName := mlist [ 1 ]
2023-09-01 08:06:48 +00:00
cond = fmt . Sprintf ( "module = '%s' and %s" , moduleName , cond )
2023-09-01 07:58:03 +00:00
2023-09-01 04:22:05 +00:00
if mquery , ok := mquerys [ mtable ] ; ok {
2023-09-01 07:58:03 +00:00
mquery . ModuleQuery [ strings . Join ( mlist [ 2 : ] , "," ) ] = struct { } { }
2023-09-01 04:22:05 +00:00
} else {
mquery := & ModuleQuery {
2023-09-01 05:32:17 +00:00
TableName : tname ,
2023-09-01 04:22:05 +00:00
ModuleName : mtable ,
2023-09-01 08:00:47 +00:00
ModuleQuery : map [ string ] struct { } { strings . Join ( mlist [ 2 : ] , "," ) : { } } }
2023-09-01 04:22:05 +00:00
mquerys [ mtable ] = mquery
}
2023-09-01 02:48:00 +00:00
}
for _ , mquery := range mquerys {
2023-09-01 07:58:03 +00:00
sqlstr := fmt . Sprintf ( "select id, module, %s as querydata from %s where %s order by ctime asc limit 1" , mquery . EncodeQuery ( "metadata" ) , mquery . TableName , cond )
2023-09-01 06:19:13 +00:00
2023-09-01 06:08:46 +00:00
raw := l . svcCtx . MysqlConn . Raw ( sqlstr )
2023-09-01 06:09:38 +00:00
if raw . Error != nil {
2023-09-01 08:05:01 +00:00
2023-09-01 06:09:38 +00:00
if raw . Error == gorm . ErrRecordNotFound {
continue
} else {
logx . Error ( raw . Error )
return resp . SetStatusWithMessage ( basic . CodeApiErr , raw . Error . Error ( ) )
}
2023-09-01 06:08:46 +00:00
}
2023-09-01 06:25:46 +00:00
var info map [ string ] any = make ( map [ string ] any )
2023-09-01 06:19:13 +00:00
err := raw . Scan ( & info ) . Error
2023-08-31 08:17:32 +00:00
if err == gorm . ErrRecordNotFound {
continue
}
if err != nil {
2023-09-01 05:24:40 +00:00
logx . Error ( err , mquery . EncodeQuery ( "metadata" ) )
2023-08-31 08:17:32 +00:00
return resp . SetStatusWithMessage ( basic . CodeApiErr , err . Error ( ) )
}
2023-09-01 07:05:42 +00:00
var querydata map [ string ] any = make ( map [ string ] any )
err = json . Unmarshal ( [ ] byte ( info [ "querydata" ] . ( string ) ) , & querydata )
if err != nil {
2023-09-01 07:58:03 +00:00
logx . Error ( err )
2023-09-01 07:05:42 +00:00
return resp . SetStatusWithMessage ( basic . CodeApiErr , err . Error ( ) )
}
2023-09-01 06:42:11 +00:00
2023-09-01 07:05:42 +00:00
for k , v := range querydata {
2023-09-01 04:22:05 +00:00
metadict [ k ] = v
}
2023-08-31 08:17:32 +00:00
}
return resp . SetStatus ( basic . CodeOK , metadict )
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *InfoLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }