123 lines
3.3 KiB
Go
123 lines
3.3 KiB
Go
package school
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
cryptoutil2 "likedream-goframe/internal/application/cpdaily/cryptoutil"
|
|
"likedream-goframe/internal/application/httpclient"
|
|
cst2 "likedream-goframe/internal/common/cst"
|
|
"likedream-goframe/internal/common/errors"
|
|
"likedream-goframe/internal/framework/redis"
|
|
"likedream-goframe/internal/utils"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/bytedance/sonic"
|
|
"github.com/samber/oops"
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
var lock = sync.RWMutex{}
|
|
|
|
func GetSchoolList(ctx context.Context) []CpdailySchoolBriefInfo {
|
|
response, err := httpclient.Cpdaily.Clone(ctx).R().
|
|
WithContext(ctx).
|
|
Get("https://static.campushoy.com/apicache/tenantListSort")
|
|
|
|
utils.OkOrPanic(err)
|
|
|
|
responseJSON := utils.ReadJson[BaseCpdailySchoolResponse[*json.RawMessage]](response.Body)
|
|
|
|
utils.OkOrPanic(responseJSON.GetError())
|
|
|
|
responseArray := gjson.ParseBytes(*responseJSON.Data)
|
|
|
|
if !responseArray.Exists() {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "今日校园返回学校信息为空"))
|
|
}
|
|
|
|
var ret []CpdailySchoolBriefInfo
|
|
|
|
for _, dataJSON := range responseArray.Array() {
|
|
datas := dataJSON.Get("datas").Array()
|
|
|
|
for _, schoolJson := range datas {
|
|
ret = append(ret, CpdailySchoolBriefInfo{
|
|
Id: schoolJson.Get("id").String(),
|
|
Name: schoolJson.Get("name").String(),
|
|
NamePinYin: schoolJson.Get("namePinYin").String(),
|
|
Img: schoolJson.Get("img").String(),
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
func GetSchoolDetail(ctx context.Context, tenantId string) SchoolDetailInfo {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
if !utils.IsDebug() {
|
|
client := redis.GetClient()
|
|
redisResult := client.Get(ctx, cst2.RedisSchoolInfo+tenantId)
|
|
if redisResult.Err() == nil {
|
|
var ret SchoolDetailInfo
|
|
err := sonic.Unmarshal([]byte(redisResult.Val()), &ret)
|
|
utils.OkOrPanic(err)
|
|
return parseSpecialSchool(ret)
|
|
}
|
|
}
|
|
response, err := httpclient.Cpdaily.Clone(ctx).R().
|
|
SetHeaders(map[string]string{
|
|
"deviceType": "2",
|
|
"CpdailyClientType": "CPDAILY",
|
|
"CacheTimeValue": "0",
|
|
"CpdailyStandAlone": "0",
|
|
"tenantId": tenantId,
|
|
}).
|
|
SetQueryParams(map[string]string{
|
|
"a": base64.StdEncoding.EncodeToString(cryptoutil2.AesEncrypt([]byte(tenantId))),
|
|
"b": cryptoutil2.EncryptVersion,
|
|
}).
|
|
WithContext(ctx).
|
|
Get("https://mobile.campushoy.com/v6/config/guest/tenant/info/v-8222")
|
|
|
|
utils.OkOrPanic(err)
|
|
|
|
responseJSON := utils.ReadJson[BaseCpdailySchoolResponse[string]](response.Body)
|
|
|
|
utils.OkOrPanic(responseJSON.GetError())
|
|
|
|
decodedEncryptData, err := base64.StdEncoding.DecodeString(responseJSON.Data)
|
|
utils.OkOrPanic(err)
|
|
|
|
decryptedRawJson := cryptoutil2.AesDecrypt(decodedEncryptData)
|
|
|
|
var ret []SchoolDetailInfo
|
|
|
|
err = sonic.Unmarshal(decryptedRawJson, &ret)
|
|
utils.OkOrPanic(err)
|
|
|
|
if len(ret) == 0 {
|
|
utils.OkOrPanic(oops.In("GetSchoolDetail").
|
|
With("tenantId", tenantId).
|
|
WithContext(ctx).
|
|
Wrap(errors.NewBusinessError(503, "学校ID不存在").Decorate("empty school detail")))
|
|
}
|
|
if !utils.IsDebug() {
|
|
client := redis.GetClient()
|
|
client.Set(ctx, cst2.RedisSchoolInfo+tenantId, ret[0], time.Duration(cst2.RedisSchoolInfoExpire)*time.Second)
|
|
}
|
|
return parseSpecialSchool(ret[0])
|
|
}
|
|
|
|
func parseSpecialSchool(s SchoolDetailInfo) SchoolDetailInfo {
|
|
// 甘肃农业大学
|
|
if s.Id == "gsau" {
|
|
s.WecloudUrl = "https://fdm.gsau.edu.cn"
|
|
}
|
|
return s
|
|
}
|