Reduce handler request boilerplate

- Add session.Attach to reuse per-request sessions across middleware and ghome handlers
- Make Session finalize/abort paths idempotent to avoid duplicate commit or rollback work
- Move request_data parsing helper to internal/utils
- Expand ParseRequestData usage across api, download, unit, live, multiunit, and subscenario handlers
- Extract download package metadata into internal/handler/download/types.go
- Return explicit errors from selected session lookup helpers and update callers
- Make api action handlers return errors directly instead of calling ss.CheckErr in nested layers

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-06-04 03:05:32 +08:00
parent 60677fe0dd
commit e61c07a9a3
53 changed files with 220 additions and 135 deletions
+2 -2
View File
@@ -1,7 +1,6 @@
package api package api
import ( import (
"encoding/json"
"fmt" "fmt"
"honoka-chan/internal/handler/api/album" "honoka-chan/internal/handler/api/album"
"honoka-chan/internal/handler/api/award" "honoka-chan/internal/handler/api/award"
@@ -32,6 +31,7 @@ import (
"honoka-chan/internal/router" "honoka-chan/internal/router"
apischema "honoka-chan/internal/schema/api" apischema "honoka-chan/internal/schema/api"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -41,7 +41,7 @@ func api(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
apiReq := []apischema.ApiReq{} apiReq := []apischema.ApiReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &apiReq) err := honokautils.ParseRequestData(ctx, &apiReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+4 -4
View File
@@ -13,14 +13,14 @@ func awardInfo(ctx *gin.Context) (res any, err error) {
var awardList []int var awardList []int
err = ss.MainEng.Table("award_m").Cols("award_id").Find(&awardList) err = ss.MainEng.Table("award_m").Cols("award_id").Find(&awardList)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
var awardID int var awardID int
_, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("award_id").Get(&awardID) _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("award_id").Get(&awardID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
awardsList := []awardapischema.Info{} awardsList := []awardapischema.Info{}
+4 -4
View File
@@ -13,14 +13,14 @@ func backgroundInfo(ctx *gin.Context) (res any, err error) {
var backgroundList []int var backgroundList []int
err = ss.MainEng.Table("background_m").Cols("background_id").Find(&backgroundList) err = ss.MainEng.Table("background_m").Cols("background_id").Find(&backgroundList)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
var backgroundID int var backgroundID int
_, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("background_id").Get(&backgroundID) _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("background_id").Get(&backgroundID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
backgroundsList := []backgroundapischema.Info{} backgroundsList := []backgroundapischema.Info{}
+4 -4
View File
@@ -16,8 +16,8 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) {
var eventID []int var eventID []int
eventsList := []eventscenarioapischema.EventScenarioList{} eventsList := []eventscenarioapischema.EventScenarioList{}
err = ss.MainEng.Table("event_scenario_m").Cols("event_id").GroupBy("event_id").OrderBy("event_id DESC").Find(&eventID) err = ss.MainEng.Table("event_scenario_m").Cols("event_id").GroupBy("event_id").OrderBy("event_id DESC").Find(&eventID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range eventID { for _, id := range eventID {
@@ -30,8 +30,8 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) {
chapsList := []eventscenarioapischema.ChapterList{} chapsList := []eventscenarioapischema.ChapterList{}
err = ss.MainEng.Table("event_scenario_m").Where("event_id = ?", id).Cols("event_scenario_id,chapter,chapter_asset,open_date"). err = ss.MainEng.Table("event_scenario_m").Where("event_id = ?", id).Cols("event_scenario_id,chapter,chapter_asset,open_date").
OrderBy("chapter DESC").Find(&eventRes) OrderBy("chapter DESC").Find(&eventRes)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, res := range eventRes { for _, res := range eventRes {
+2 -2
View File
@@ -14,8 +14,8 @@ func owningPoint(ctx *gin.Context) (res any, err error) {
var exchangeID []int var exchangeID []int
exPointsList := []exchangeapischema.ExchangePointList{} exPointsList := []exchangeapischema.ExchangePointList{}
err = ss.MainEng.Table("exchange_point_m").Cols("exchange_point_id").OrderBy("exchange_point_id ASC").Find(&exchangeID) err = ss.MainEng.Table("exchange_point_m").Cols("exchange_point_id").OrderBy("exchange_point_id ASC").Find(&exchangeID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range exchangeID { for _, id := range exchangeID {
+2 -2
View File
@@ -14,8 +14,8 @@ func liveSchedule(ctx *gin.Context) (res any, err error) {
var liveID []int var liveID []int
err = ss.MainEng.Table("special_live_m"). err = ss.MainEng.Table("special_live_m").
Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveID) Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
liveList := []liveapischema.LiveList{} liveList := []liveapischema.LiveList{}
+4 -4
View File
@@ -14,8 +14,8 @@ func liveStatus(ctx *gin.Context) (res any, err error) {
var liveDifficultyID []int var liveDifficultyID []int
normalLives := []liveapischema.NormalLiveStatusList{} normalLives := []liveapischema.NormalLiveStatusList{}
err = ss.MainEng.Table("normal_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID) err = ss.MainEng.Table("normal_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range liveDifficultyID { for _, id := range liveDifficultyID {
normalLive := liveapischema.NormalLiveStatusList{ normalLive := liveapischema.NormalLiveStatusList{
@@ -31,8 +31,8 @@ func liveStatus(ctx *gin.Context) (res any, err error) {
specialLives := []liveapischema.SpecialLiveStatusList{} specialLives := []liveapischema.SpecialLiveStatusList{}
err = ss.MainEng.Table("special_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID) err = ss.MainEng.Table("special_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range liveDifficultyID { for _, id := range liveDifficultyID {
specialLive := liveapischema.SpecialLiveStatusList{ specialLive := liveapischema.SpecialLiveStatusList{
@@ -15,8 +15,8 @@ func MultiUnitScenarioStatus(ctx *gin.Context) (res any, err error) {
var statusID []int var statusID []int
multiUnitsList := []multiunitapischema.StatusList{} multiUnitsList := []multiunitapischema.StatusList{}
err = ss.MainEng.Table("multi_unit_scenario_m").Cols("multi_unit_id").GroupBy("multi_unit_id").OrderBy("multi_unit_id ASC").Find(&statusID) err = ss.MainEng.Table("multi_unit_scenario_m").Cols("multi_unit_id").GroupBy("multi_unit_id").OrderBy("multi_unit_id ASC").Find(&statusID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range statusID { for _, id := range statusID {
@@ -30,8 +30,8 @@ func MultiUnitScenarioStatus(ctx *gin.Context) (res any, err error) {
Join("LEFT", "multi_unit_scenario_open_m", "multi_unit_scenario_m.multi_unit_id = multi_unit_scenario_open_m.multi_unit_id"). Join("LEFT", "multi_unit_scenario_open_m", "multi_unit_scenario_m.multi_unit_id = multi_unit_scenario_open_m.multi_unit_id").
Cols("multi_unit_scenario_btn_asset,open_date,multi_unit_scenario_id,chapter"). Cols("multi_unit_scenario_btn_asset,open_date,multi_unit_scenario_id,chapter").
Where("multi_unit_scenario_m.multi_unit_id = ?", id).Get(&multiRes) Where("multi_unit_scenario_m.multi_unit_id = ?", id).Get(&multiRes)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
multiUnitsList = append(multiUnitsList, multiunitapischema.StatusList{ multiUnitsList = append(multiUnitsList, multiunitapischema.StatusList{
+2 -2
View File
@@ -21,8 +21,8 @@ func museumInfo(ctx *gin.Context) (res any, err error) {
var smileBuff, pureBuff, coolBuff int var smileBuff, pureBuff, coolBuff int
err = ss.MainEng.Table("museum_contents_m").Cols("museum_contents_id,smile_buff,pure_buff,cool_buff"). err = ss.MainEng.Table("museum_contents_m").Cols("museum_contents_id,smile_buff,pure_buff,cool_buff").
OrderBy("museum_contents_id ASC").Find(&museumRes) OrderBy("museum_contents_id ASC").Find(&museumRes)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, res := range museumRes { for _, res := range museumRes {
+2 -2
View File
@@ -14,8 +14,8 @@ func scenarioStatus(ctx *gin.Context) (res any, err error) {
var scenarioID []int var scenarioID []int
scenarioLists := []scenarioapischema.StatusList{} scenarioLists := []scenarioapischema.StatusList{}
err = ss.MainEng.Table("scenario_m").Cols("scenario_id").OrderBy("scenario_id ASC").Find(&scenarioID) err = ss.MainEng.Table("scenario_m").Cols("scenario_id").OrderBy("scenario_id ASC").Find(&scenarioID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range scenarioID { for _, id := range scenarioID {
+2 -2
View File
@@ -14,8 +14,8 @@ func subscenarioStatus(ctx *gin.Context) (res any, err error) {
var subScenarioID []int var subScenarioID []int
subScenarioLists := []subscenarioapischema.StatusList{} subScenarioLists := []subscenarioapischema.StatusList{}
err = ss.MainEng.Table("subscenario_m").Cols("subscenario_id").OrderBy("subscenario_id ASC").Find(&subScenarioID) err = ss.MainEng.Table("subscenario_m").Cols("subscenario_id").OrderBy("subscenario_id ASC").Find(&subScenarioID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for _, id := range subScenarioID { for _, id := range subScenarioID {
+4 -4
View File
@@ -13,8 +13,8 @@ func unitAccessoryAll(ctx *gin.Context) (res any, err error) {
accessoryList := []unitapischema.AccessoryList{} accessoryList := []unitapischema.AccessoryList{}
err = ss.MainEng.Table("common_accessory_m").Find(&accessoryList) err = ss.MainEng.Table("common_accessory_m").Find(&accessoryList)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
for k := range accessoryList { for k := range accessoryList {
accessoryList[k].NextExp = 0 accessoryList[k].NextExp = 0
@@ -25,8 +25,8 @@ func unitAccessoryAll(ctx *gin.Context) (res any, err error) {
} }
wearingInfo := []unitapischema.WearingInfo{} wearingInfo := []unitapischema.WearingInfo{}
err = ss.UserEng.Table("user_accessory_wear").Where("user_id = ?", ss.UserID).Find(&wearingInfo) err = ss.UserEng.Table("user_accessory_wear").Where("user_id = ?", ss.UserID).Find(&wearingInfo)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
res = unitapischema.AccessoryAllResp{ res = unitapischema.AccessoryAllResp{
Result: unitapischema.AccessoryAllData{ Result: unitapischema.AccessoryAllData{
+2 -2
View File
@@ -15,8 +15,8 @@ func unitAll(ctx *gin.Context) (res any, err error) {
unitMap := []unitmodel.UnitDataMap{} unitMap := []unitmodel.UnitDataMap{}
err = ss.GetBasicUnitInfo(). err = ss.GetBasicUnitInfo().
Where("a.user_id = ?", ss.UserID).Find(&unitMap) Where("a.user_id = ?", ss.UserID).Find(&unitMap)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
unitsData := []unitapischema.Active{} unitsData := []unitapischema.Active{}
+4 -4
View File
@@ -13,16 +13,16 @@ func unitDeckInfo(ctx *gin.Context) (res any, err error) {
userDeck := []unitapischema.UserDeckData{} userDeck := []unitapischema.UserDeckData{}
err = ss.UserEng.Table("user_deck").Where("user_id = ?", ss.UserID).Asc("deck_id").Find(&userDeck) err = ss.UserEng.Table("user_deck").Where("user_id = ?", ss.UserID).Asc("deck_id").Find(&userDeck)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
unitDeckInfo := []unitapischema.DeckInfoData{} unitDeckInfo := []unitapischema.DeckInfoData{}
for _, deck := range userDeck { for _, deck := range userDeck {
deckUnit := []unitapischema.UnitDeckData{} deckUnit := []unitapischema.UnitDeckData{}
err = ss.UserEng.Table("user_deck_unit").Where("user_deck_id = ?", deck.ID).Asc("position").Find(&deckUnit) err = ss.UserEng.Table("user_deck_unit").Where("user_deck_id = ?", deck.ID).Asc("position").Find(&deckUnit)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
oUID := []unitapischema.UnitOwningUserIds{} oUID := []unitapischema.UnitOwningUserIds{}
@@ -14,14 +14,14 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
var skillEquipCount []unitapischema.SkillEquipCount var skillEquipCount []unitapischema.SkillEquipCount
err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Select("unit_removable_skill_id,COUNT(*) AS ct"). err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Select("unit_removable_skill_id,COUNT(*) AS ct").
GroupBy("unit_removable_skill_id").Find(&skillEquipCount) GroupBy("unit_removable_skill_id").Find(&skillEquipCount)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
var rmSkillIds []int var rmSkillIds []int
err = ss.MainEng.Table("unit_removable_skill_m").Where("effect_range = 1").Cols("unit_removable_skill_id").Find(&rmSkillIds) err = ss.MainEng.Table("unit_removable_skill_m").Where("effect_range = 1").Cols("unit_removable_skill_id").Find(&rmSkillIds)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
owingInfo := []unitapischema.OwningInfo{} owingInfo := []unitapischema.OwningInfo{}
@@ -43,8 +43,8 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
var unitOwningIds []int var unitOwningIds []int
err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Cols("unit_owning_user_id").GroupBy("unit_owning_user_id").Find(&unitOwningIds) err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Cols("unit_owning_user_id").GroupBy("unit_owning_user_id").Find(&unitOwningIds)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
equipInfo := map[int]any{} equipInfo := map[int]any{}
@@ -52,8 +52,8 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
detail := []unitapischema.SkillEquipDetail{} detail := []unitapischema.SkillEquipDetail{}
err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, v). err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, v).
Cols("unit_removable_skill_id").Find(&detail) Cols("unit_removable_skill_id").Find(&detail)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
equipInfo[v] = unitapischema.SkillEquipList{ equipInfo[v] = unitapischema.SkillEquipList{
+2 -2
View File
@@ -13,8 +13,8 @@ func userGetNavi(ctx *gin.Context) (res any, err error) {
var uID, oID int var uID, oID int
_, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("user_id,unit_owning_user_id").Get(&uID, &oID) _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Cols("user_id,unit_owning_user_id").Get(&uID, &oID)
if ss.CheckErr(err) { if err != nil {
return return nil, err
} }
res = userapischema.GetNaviResp{ res = userapischema.GetNaviResp{
+2 -9
View File
@@ -1,30 +1,23 @@
package download package download
import ( import (
"encoding/json"
"fmt" "fmt"
"honoka-chan/config" "honoka-chan/config"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
downloadschema "honoka-chan/internal/schema/download" downloadschema "honoka-chan/internal/schema/download"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type PkgInfo struct {
PkgType int `xorm:"pkg_type"`
PkgID int `xorm:"pkg_id"`
Order int `xorm:"pkg_order"`
Size int `xorm:"pkg_size"`
}
func additional(ctx *gin.Context) { func additional(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
defer ss.Finalize() defer ss.Finalize()
downloadReq := downloadschema.AdditionalReq{} downloadReq := downloadschema.AdditionalReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) err := honokautils.ParseRequestData(ctx, &downloadReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,13 +1,13 @@
package download package download
import ( import (
"encoding/json"
"fmt" "fmt"
"honoka-chan/config" "honoka-chan/config"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
downloadschema "honoka-chan/internal/schema/download" downloadschema "honoka-chan/internal/schema/download"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"xorm.io/builder" "xorm.io/builder"
@@ -18,7 +18,7 @@ func batch(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
downloadReq := downloadschema.BatchReq{} downloadReq := downloadschema.BatchReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) err := honokautils.ParseRequestData(ctx, &downloadReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,13 +1,13 @@
package download package download
import ( import (
"encoding/json"
"fmt" "fmt"
"honoka-chan/config" "honoka-chan/config"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
downloadschema "honoka-chan/internal/schema/download" downloadschema "honoka-chan/internal/schema/download"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"strings" "strings"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -18,7 +18,7 @@ func getUrl(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
downloadReq := downloadschema.UrlReq{} downloadReq := downloadschema.UrlReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) err := honokautils.ParseRequestData(ctx, &downloadReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+8
View File
@@ -0,0 +1,8 @@
package download
type PkgInfo struct {
PkgType int `xorm:"pkg_type"`
PkgID int `xorm:"pkg_id"`
Order int `xorm:"pkg_order"`
Size int `xorm:"pkg_size"`
}
+2 -2
View File
@@ -1,13 +1,13 @@
package download package download
import ( import (
"encoding/json"
"fmt" "fmt"
"honoka-chan/config" "honoka-chan/config"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
downloadschema "honoka-chan/internal/schema/download" downloadschema "honoka-chan/internal/schema/download"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"io" "io"
"net/http" "net/http"
"strings" "strings"
@@ -23,7 +23,7 @@ func update(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
downloadReq := downloadschema.UpdateReq{} downloadReq := downloadschema.UpdateReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) err := honokautils.ParseRequestData(ctx, &downloadReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+1 -1
View File
@@ -9,7 +9,7 @@ import (
) )
func active(ctx *gin.Context) { func active(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
ss.Respond(ghomeschema.ActiveResp{ ss.Respond(ghomeschema.ActiveResp{
+1 -1
View File
@@ -13,7 +13,7 @@ import (
) )
func initialize(ctx *gin.Context) { func initialize(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
initData := ghomeschema.InitializeData{ initData := ghomeschema.InitializeData{
+1 -1
View File
@@ -33,7 +33,7 @@ const (
) )
func login(ctx *gin.Context) { func login(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
data, err := ctx.GetRawData() data, err := ctx.GetRawData()
+1 -1
View File
@@ -15,7 +15,7 @@ import (
) )
func loginAuto(ctx *gin.Context) { func loginAuto(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
data, err := ctx.GetRawData() data, err := ctx.GetRawData()
+1 -1
View File
@@ -11,7 +11,7 @@ import (
) )
func reportRole(ctx *gin.Context) { func reportRole(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
randKey, err := ss.Get3DESRandKey() randKey, err := ss.Get3DESRandKey()
+1 -1
View File
@@ -10,7 +10,7 @@ import (
) )
func getCode(ctx *gin.Context) { func getCode(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
codeArray := `{"codeArray":[{"btntext":"好的","code":"-10264022","msg_from":2,"text":"","title":"短信验证码被阻止","type":1},{"btntext":"","code":"-10869623","msg_from":2,"text":"","title":"网络连接失败,无法一键登录","type":2},{"btntext":"","code":"10298300","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298311","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298312","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298313","msg_from":2,"text":"","title":"","type":1},{"btntext":"","code":"10298321","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298322","msg_from":2,"text":"","title":"","type":3}],"codeVersion":"1.0.5"}` codeArray := `{"codeArray":[{"btntext":"好的","code":"-10264022","msg_from":2,"text":"","title":"短信验证码被阻止","type":1},{"btntext":"","code":"-10869623","msg_from":2,"text":"","title":"网络连接失败,无法一键登录","type":2},{"btntext":"","code":"10298300","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298311","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298312","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298313","msg_from":2,"text":"","title":"","type":1},{"btntext":"","code":"10298321","msg_from":2,"text":"","title":"","type":3},{"btntext":"","code":"10298322","msg_from":2,"text":"","title":"","type":3}],"codeVersion":"1.0.5"}`
@@ -9,7 +9,7 @@ import (
) )
func getProductList(ctx *gin.Context) { func getProductList(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
getProductListData := ghomeschema.GetProductListData{ getProductListData := ghomeschema.GetProductListData{
+1 -1
View File
@@ -17,7 +17,7 @@ import (
) )
func handshake(ctx *gin.Context) { func handshake(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
data, err := ctx.GetRawData() data, err := ctx.GetRawData()
+1 -1
View File
@@ -9,7 +9,7 @@ import (
) )
func loginArea(ctx *gin.Context) { func loginArea(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
ss.Respond(ghomeschema.LoginAreaResp{ ss.Respond(ghomeschema.LoginAreaResp{
+1 -1
View File
@@ -13,7 +13,7 @@ import (
) )
func publicKey(ctx *gin.Context) { func publicKey(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
publicKeyCode := 0 publicKeyCode := 0
+1 -1
View File
@@ -9,7 +9,7 @@ import (
) )
func status(ctx *gin.Context) { func status(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
ss.Respond(ghomeschema.GuestStatusResp{ ss.Respond(ghomeschema.GuestStatusResp{
+1 -1
View File
@@ -9,7 +9,7 @@ import (
) )
func agreement(ctx *gin.Context) { func agreement(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
ss.Respond(ghomeschema.AgreementResp{ ss.Respond(ghomeschema.AgreementResp{
+1 -1
View File
@@ -9,7 +9,7 @@ import (
) )
func appReport(ctx *gin.Context) { func appReport(ctx *gin.Context) {
ss := session.New(ctx) ss := session.Attach(ctx)
defer ss.Finalize() defer ss.Finalize()
ss.Respond(ghomeschema.AppReportResp{ ss.Respond(ghomeschema.AppReportResp{
+2 -1
View File
@@ -7,6 +7,7 @@ import (
"honoka-chan/internal/router" "honoka-chan/internal/router"
liveschema "honoka-chan/internal/schema/live" liveschema "honoka-chan/internal/schema/live"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"honoka-chan/pkg/utils" "honoka-chan/pkg/utils"
"math" "math"
"strconv" "strconv"
@@ -20,7 +21,7 @@ func play(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
playReq := liveschema.PlayReq{} playReq := liveschema.PlayReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playReq) err := honokautils.ParseRequestData(ctx, &playReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -1
View File
@@ -8,6 +8,7 @@ import (
"honoka-chan/internal/router" "honoka-chan/internal/router"
liveschema "honoka-chan/internal/schema/live" liveschema "honoka-chan/internal/schema/live"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"honoka-chan/pkg/utils" "honoka-chan/pkg/utils"
"strconv" "strconv"
"time" "time"
@@ -20,7 +21,7 @@ func preciseScore(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
playScoreReq := liveschema.PlayScoreReq{} playScoreReq := liveschema.PlayScoreReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playScoreReq) err := honokautils.ParseRequestData(ctx, &playScoreReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,12 +1,12 @@
package live package live
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
"honoka-chan/internal/router" "honoka-chan/internal/router"
liveschema "honoka-chan/internal/schema/live" liveschema "honoka-chan/internal/schema/live"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"honoka-chan/pkg/utils" "honoka-chan/pkg/utils"
"time" "time"
@@ -21,7 +21,7 @@ func reward(ctx *gin.Context) {
}() }()
playRewardReq := liveschema.RewardReq{} playRewardReq := liveschema.RewardReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playRewardReq) err := honokautils.ParseRequestData(ctx, &playRewardReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+4 -1
View File
@@ -19,7 +19,10 @@ func login(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
defer ss.Finalize() defer ss.Finalize()
has, authKeyData := ss.GetAuthKey(ctx.MustGet("token").(string)) has, authKeyData, err := ss.GetAuthKey(ctx.MustGet("token").(string))
if ss.CheckErr(err) {
return
}
if !has { if !has {
ss.Abort(errors.New("invalid token")) ss.Abort(errors.New("invalid token"))
return return
@@ -1,11 +1,11 @@
package multiunit package multiunit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
multiunitschema "honoka-chan/internal/schema/multiunit" multiunitschema "honoka-chan/internal/schema/multiunit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -16,7 +16,7 @@ func scenarioStartup(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
startReq := multiunitschema.ScenarioStartUpReq{} startReq := multiunitschema.ScenarioStartUpReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &startReq) err := honokautils.ParseRequestData(ctx, &startReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,11 +1,11 @@
package subscenario package subscenario
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
subscenarioschema "honoka-chan/internal/schema/subscenario" subscenarioschema "honoka-chan/internal/schema/subscenario"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -16,7 +16,7 @@ func startup(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
startReq := subscenarioschema.StartUpReq{} startReq := subscenarioschema.StartUpReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &startReq) err := honokautils.ParseRequestData(ctx, &startReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,7 +1,6 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
unitmodel "honoka-chan/internal/model/unit" unitmodel "honoka-chan/internal/model/unit"
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
@@ -9,6 +8,7 @@ import (
unitapischema "honoka-chan/internal/schema/api/unit" unitapischema "honoka-chan/internal/schema/api/unit"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -19,7 +19,7 @@ func deck(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
deckReq := unitschema.DeckReq{} deckReq := unitschema.DeckReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &deckReq) err := honokautils.ParseRequestData(ctx, &deckReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,12 +1,12 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitapischema "honoka-chan/internal/schema/api/unit" unitapischema "honoka-chan/internal/schema/api/unit"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -16,7 +16,7 @@ func deckName(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
deckReq := unitschema.DeckNameReq{} deckReq := unitschema.DeckNameReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &deckReq) err := honokautils.ParseRequestData(ctx, &deckReq)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,12 +1,12 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -16,7 +16,7 @@ func favorite(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
var req unitschema.FavoriteReq var req unitschema.FavoriteReq
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) err := honokautils.ParseRequestData(ctx, &req)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
@@ -1,11 +1,11 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -15,7 +15,7 @@ func removableSkillEquipment(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
req := unitschema.RemovableSkillEquipmentReq{} req := unitschema.RemovableSkillEquipmentReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) err := honokautils.ParseRequestData(ctx, &req)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,12 +1,12 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -17,7 +17,7 @@ func sale(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
req := unitschema.SaleReq{} req := unitschema.SaleReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) err := honokautils.ParseRequestData(ctx, &req)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,12 +1,12 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -16,7 +16,7 @@ func setDisplayRank(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
var req unitschema.SetDisplayRankReq var req unitschema.SetDisplayRankReq
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) err := honokautils.ParseRequestData(ctx, &req)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+2 -2
View File
@@ -1,11 +1,11 @@
package unit package unit
import ( import (
"encoding/json"
"honoka-chan/internal/middleware" "honoka-chan/internal/middleware"
"honoka-chan/internal/router" "honoka-chan/internal/router"
unitschema "honoka-chan/internal/schema/unit" unitschema "honoka-chan/internal/schema/unit"
"honoka-chan/internal/session" "honoka-chan/internal/session"
honokautils "honoka-chan/internal/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -15,7 +15,7 @@ func wearAccessory(ctx *gin.Context) {
defer ss.Finalize() defer ss.Finalize()
req := unitschema.WearAccessoryReq{} req := unitschema.WearAccessoryReq{}
err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) err := honokautils.ParseRequestData(ctx, &req)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return return
} }
+1 -1
View File
@@ -36,7 +36,7 @@ func Common(ctx *gin.Context) {
uid := ctx.GetHeader("User-ID") uid := ctx.GetHeader("User-ID")
ctx.Set("userid", uid) ctx.Set("userid", uid)
ss := session.New(ctx) ss := session.Attach(ctx)
ctx.Set("session", ss) ctx.Set("session", ss)
authorize := ctx.GetHeader("Authorize") authorize := ctx.GetHeader("Authorize")
+9 -6
View File
@@ -4,25 +4,28 @@ import (
usermodel "honoka-chan/internal/model/user" usermodel "honoka-chan/internal/model/user"
) )
func (ss *Session) GetUserDeck(deckID int) (bool, *usermodel.UserDeck) { func (ss *Session) GetUserDeck(deckID int) (bool, *usermodel.UserDeck, error) {
deckData := usermodel.UserDeck{} deckData := usermodel.UserDeck{}
has, err := ss.UserEng.Table("user_deck"). has, err := ss.UserEng.Table("user_deck").
Where("user_id = ? AND deck_id = ?", ss.UserID, deckID).Get(&deckData) Where("user_id = ? AND deck_id = ?", ss.UserID, deckID).Get(&deckData)
if ss.CheckErr(err) { if err != nil {
return false, nil return false, nil, err
} }
return has, &deckData return has, &deckData, nil
} }
func (ss *Session) GetUserDeckUnit(deckID int) []usermodel.UserDeckUnit { func (ss *Session) GetUserDeckUnit(deckID int) []usermodel.UserDeckUnit {
has, deckData := ss.GetUserDeck(deckID) has, deckData, err := ss.GetUserDeck(deckID)
if ss.CheckErr(err) {
return []usermodel.UserDeckUnit{}
}
if !has { if !has {
return []usermodel.UserDeckUnit{} return []usermodel.UserDeckUnit{}
} }
unitData := []usermodel.UserDeckUnit{} unitData := []usermodel.UserDeckUnit{}
err := ss.UserEng.Table("user_deck_unit"). err = ss.UserEng.Table("user_deck_unit").
Where("user_deck_id = ?", deckData.ID).Find(&unitData) Where("user_deck_id = ?", deckData.ID).Find(&unitData)
if ss.CheckErr(err) { if ss.CheckErr(err) {
return []usermodel.UserDeckUnit{} return []usermodel.UserDeckUnit{}
+15 -8
View File
@@ -6,26 +6,30 @@ import (
) )
func (ss *Session) GetDeviceID() string { func (ss *Session) GetDeviceID() string {
return ss.Ctx.Request.Header.Get("X-DEVICEID") return ss.deviceID
} }
func (ss *Session) GetRandKey() []byte { func (ss *Session) GetRandKey() ([]byte, error) {
deviceKey := ghomemodel.DeviceKey{} deviceKey := ghomemodel.DeviceKey{}
has, err := ss.UserEng.Table(new(ghomemodel.DeviceKey)). has, err := ss.UserEng.Table(new(ghomemodel.DeviceKey)).
Where("device_id = ?", ss.GetDeviceID()).Get(&deviceKey) Where("device_id = ?", ss.GetDeviceID()).Get(&deviceKey)
if ss.CheckErr(err) { if err != nil {
return nil return nil, err
} }
if !has { if !has {
return nil return nil, nil
} }
return []byte(deviceKey.RandKey) return []byte(deviceKey.RandKey), nil
} }
func (ss *Session) SetRandKey(key string) { func (ss *Session) SetRandKey(key string) {
var err error var err error
if ss.GetRandKey() == nil { randKey, err := ss.GetRandKey()
if ss.CheckErr(err) {
return
}
if randKey == nil {
_, err = ss.UserEng.Insert(&ghomemodel.DeviceKey{ _, err = ss.UserEng.Insert(&ghomemodel.DeviceKey{
DeviceID: ss.GetDeviceID(), DeviceID: ss.GetDeviceID(),
RandKey: key, RandKey: key,
@@ -40,7 +44,10 @@ func (ss *Session) SetRandKey(key string) {
} }
func (ss *Session) Get3DESRandKey() ([]byte, error) { func (ss *Session) Get3DESRandKey() ([]byte, error) {
randKey := ss.GetRandKey() randKey, err := ss.GetRandKey()
if err != nil {
return nil, err
}
if len(randKey) < 24 { if len(randKey) < 24 {
return nil, errors.New("invalid rand key") return nil, errors.New("invalid rand key")
} }
+4 -4
View File
@@ -2,15 +2,15 @@ package session
import loginmodel "honoka-chan/internal/model/login" import loginmodel "honoka-chan/internal/model/login"
func (ss *Session) GetAuthKey(token string) (bool, *loginmodel.AuthKey) { func (ss *Session) GetAuthKey(token string) (bool, *loginmodel.AuthKey, error) {
authKeyData := loginmodel.AuthKey{} authKeyData := loginmodel.AuthKey{}
has, err := ss.UserEng.Table(new(loginmodel.AuthKey)). has, err := ss.UserEng.Table(new(loginmodel.AuthKey)).
Where("authorize_token = ?", token).Get(&authKeyData) Where("authorize_token = ?", token).Get(&authKeyData)
if ss.CheckErr(err) { if err != nil {
return false, nil return false, nil, err
} }
return has, &authKeyData return has, &authKeyData, nil
} }
func (ss *Session) SetAuthKey(authKey *loginmodel.AuthKey) { func (ss *Session) SetAuthKey(authKey *loginmodel.AuthKey) {
+71 -13
View File
@@ -13,19 +13,36 @@ import (
"xorm.io/xorm" "xorm.io/xorm"
) )
type Session struct { type responseHooks struct {
Ctx *gin.Context setHeader func(string, string)
writeJSON func(int, any)
writeBody func(int, string)
abort func()
}
type Session struct {
MainEng *xorm.Session MainEng *xorm.Session
UserEng *xorm.Session UserEng *xorm.Session
UserID int UserID int
UserPref usermodel.UserPref UserPref usermodel.UserPref
deviceID string
resp responseHooks
done bool
} }
func New(ctx *gin.Context) *Session { func New(ctx *gin.Context) *Session {
ss := &Session{ ss := &Session{
Ctx: ctx, deviceID: ctx.GetHeader("X-DEVICEID"),
resp: responseHooks{
setHeader: ctx.Header,
writeJSON: ctx.JSON,
writeBody: func(code int, body string) {
ctx.String(code, body)
},
abort: ctx.Abort,
},
} }
ss.MainEng = db.MainEng.NewSession() ss.MainEng = db.MainEng.NewSession()
@@ -45,21 +62,62 @@ func Get(ctx *gin.Context) *Session {
return ctx.MustGet("session").(*Session) return ctx.MustGet("session").(*Session)
} }
func Attach(ctx *gin.Context) *Session {
if ss, ok := ctx.Get("session"); ok {
return ss.(*Session)
}
ss := New(ctx)
ctx.Set("session", ss)
return ss
}
func (ss *Session) Finalize() { func (ss *Session) Finalize() {
ss.MainEng.Close() if ss.done {
if ss.CheckErr(ss.UserEng.Commit()) {
return return
} }
ss.done = true
if ss.MainEng != nil {
ss.MainEng.Close()
ss.MainEng = nil
}
if ss.UserEng == nil {
return
}
if err := ss.UserEng.Commit(); err != nil {
log.Println(err.Error())
ss.UserEng.Close()
ss.UserEng = nil
ss.resp.writeJSON(500, gin.H{"error": err.Error()})
ss.resp.abort()
return
}
ss.UserEng.Close() ss.UserEng.Close()
ss.UserEng = nil
} }
func (ss *Session) Abort(err error) { func (ss *Session) Abort(err error) {
ss.MainEng.Close() if ss.done {
ss.UserEng.Rollback() return
ss.UserEng.Close() }
ss.done = true
ss.Ctx.JSON(500, gin.H{"error": err.Error()}) if ss.MainEng != nil {
ss.Ctx.Abort() ss.MainEng.Close()
ss.MainEng = nil
}
if ss.UserEng != nil {
ss.UserEng.Rollback()
ss.UserEng.Close()
ss.UserEng = nil
}
ss.resp.writeJSON(500, gin.H{"error": err.Error()})
ss.resp.abort()
} }
func (ss *Session) CheckErr(err error) bool { func (ss *Session) CheckErr(err error) bool {
@@ -77,7 +135,7 @@ func (ss *Session) Respond(resp any) {
return return
} }
ss.Ctx.Header("Content-Type", "application/json") ss.resp.setHeader("Content-Type", "application/json")
ss.Ctx.Header("X-Message-Sign", base64.StdEncoding.EncodeToString(encrypt.RSASignSHA1(data))) ss.resp.setHeader("X-Message-Sign", base64.StdEncoding.EncodeToString(encrypt.RSASignSHA1(data)))
ss.Ctx.String(http.StatusOK, string(data)) ss.resp.writeBody(http.StatusOK, string(data))
} }
+11
View File
@@ -0,0 +1,11 @@
package utils
import (
"encoding/json"
"github.com/gin-gonic/gin"
)
func ParseRequestData(ctx *gin.Context, dst any) error {
return json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), dst)
}