From 96b7951ee12a5bd811040d5828f4c99d948aab3c Mon Sep 17 00:00:00 2001 From: Sean Du Date: Mon, 13 Jul 2026 07:51:09 +0800 Subject: [PATCH] Scope unit and accessory data to owning users Signed-off-by: Sean Du --- internal/handler/api/profile/info.go | 2 +- internal/handler/friend/list.go | 2 +- internal/handler/live/live.go | 2 ++ internal/handler/notice/common.go | 2 +- internal/handler/ranking/live.go | 2 +- internal/handler/unit/deck.go | 14 ++++++++++---- internal/handler/unit/favorite.go | 3 ++- internal/handler/unit/removableskillequipment.go | 11 ++++++++++- internal/handler/unit/sale.go | 12 ++++++++---- internal/handler/unit/setdisplayrank.go | 3 ++- internal/handler/unit/wearaccessory.go | 9 +++++++++ internal/session/accessory.go | 14 +++++++++++--- internal/session/deck.go | 2 +- internal/session/unit.go | 10 ++++++++-- 14 files changed, 67 insertions(+), 21 deletions(-) diff --git a/internal/handler/api/profile/info.go b/internal/handler/api/profile/info.go index 3d67769..bafe215 100644 --- a/internal/handler/api/profile/info.go +++ b/internal/handler/api/profile/info.go @@ -326,7 +326,7 @@ func getAccessoryInfo(ss *session.Session, targetUserID, unitOwningUserID int) ( return nil, nil } - has, accessoryData := ss.GetAccessoryByAccessoryOwningUserID(accessoryOwningID) + has, accessoryData := ss.GetAccessoryByAccessoryOwningUserIDForUser(targetUserID, accessoryOwningID) if !has { return nil, nil } diff --git a/internal/handler/friend/list.go b/internal/handler/friend/list.go index ad80d0f..db096f7 100644 --- a/internal/handler/friend/list.go +++ b/internal/handler/friend/list.go @@ -179,7 +179,7 @@ func buildCenterUnitInfo(ss *session.Session, userID, unitOwningUserID, awardID return info, err } if has && accessoryWear.AccessoryOwningUserID > 0 { - hasAccessory, accessoryData := ss.GetAccessoryByAccessoryOwningUserID(accessoryWear.AccessoryOwningUserID) + hasAccessory, accessoryData := ss.GetAccessoryByAccessoryOwningUserIDForUser(userID, accessoryWear.AccessoryOwningUserID) if hasAccessory { accessoryInfo = friendschema.AccessoryInfo{ AccessoryOwningUserID: accessoryWear.AccessoryOwningUserID, diff --git a/internal/handler/live/live.go b/internal/handler/live/live.go index fc4b55f..dda0e86 100644 --- a/internal/handler/live/live.go +++ b/internal/handler/live/live.go @@ -180,6 +180,7 @@ func matchMemberTag(ss *session.Session, cache map[memberTagMatchKey]bool, unitT func loadDeckUnitDataMap(ss *session.Session, unitOwningUserIDs []int) (map[int]unitmodel.UnitDataMap, error) { unitRows := []unitmodel.UnitDataMap{} err := ss.GetBasicUnitInfo(). + Where("a.user_id = ?", ss.UserID). In("a.unit_owning_user_id", unitOwningUserIDs). Find(&unitRows) if err != nil { @@ -221,6 +222,7 @@ func loadAccessoryBonusMap(ss *session.Session, userID int, unitOwningUserIDs [] rows := []accessoryBonusRow{} err = ss.UserEng.Table("user_accessory"). + Where("user_id = ?", userID). In("accessory_owning_user_id", accessoryIDs). Cols("accessory_owning_user_id,accessory_id"). Find(&rows) diff --git a/internal/handler/notice/common.go b/internal/handler/notice/common.go index 6a48513..dc92161 100644 --- a/internal/handler/notice/common.go +++ b/internal/handler/notice/common.go @@ -134,7 +134,7 @@ func getGreetingAccessoryInfo(ss *session.Session, userID, unitOwningUserID int) return nil, nil } - has, accessoryData := ss.GetAccessoryByAccessoryOwningUserID(accessoryWear.AccessoryOwningUserID) + has, accessoryData := ss.GetAccessoryByAccessoryOwningUserIDForUser(userID, accessoryWear.AccessoryOwningUserID) if !has { return nil, nil } diff --git a/internal/handler/ranking/live.go b/internal/handler/ranking/live.go index d562ca9..d0754fd 100644 --- a/internal/handler/ranking/live.go +++ b/internal/handler/ranking/live.go @@ -200,7 +200,7 @@ func getRankingAccessoryInfo(ss *session.Session, targetUserID, unitOwningUserID return nil, nil } - has, accessoryData := ss.GetAccessoryByAccessoryOwningUserID(accessoryOwningID) + has, accessoryData := ss.GetAccessoryByAccessoryOwningUserIDForUser(targetUserID, accessoryOwningID) if !has { return nil, nil } diff --git a/internal/handler/unit/deck.go b/internal/handler/unit/deck.go index 2032ec4..81f8268 100644 --- a/internal/handler/unit/deck.go +++ b/internal/handler/unit/deck.go @@ -33,13 +33,15 @@ func deck(ctx *gin.Context) { } // 删除全部原有队伍成员 - _, err = ss.UserEng.Table("user_deck_unit").In("user_deck_id", userDeckID).Delete() + _, err = ss.UserEng.Table("user_deck_unit"). + Where("user_id = ?", ss.UserID).In("user_deck_id", userDeckID).Delete() if ss.CheckErr(err) { return } // 删除全部原有队伍 - _, err = ss.UserEng.Table("user_deck").In("id", userDeckID).Delete() + _, err = ss.UserEng.Table("user_deck"). + Where("user_id = ?", ss.UserID).In("id", userDeckID).Delete() if ss.CheckErr(err) { return } @@ -65,11 +67,15 @@ func deck(ctx *gin.Context) { for _, u := range deck.UnitDeckDetail { // 成员信息 unitData := unitmodel.UnitDataMap{} - _, err = ss.GetBasicUnitInfo(). - Where("a.unit_owning_user_id = ?", u.UnitOwningUserID).Get(&unitData) + has, err := ss.GetBasicUnitInfo(). + Where("a.user_id = ? AND a.unit_owning_user_id = ?", ss.UserID, u.UnitOwningUserID).Get(&unitData) if ss.CheckErr(err) { return } + if !has { + ss.AbortWithStatus(http.StatusNotFound, honokautils.NewNotFoundContent(ctx.Request.URL.Path)) + return + } // fmt.Println("新的成员信息:", unitData) // 插入新成员信息 diff --git a/internal/handler/unit/favorite.go b/internal/handler/unit/favorite.go index 81c70f4..f93c475 100644 --- a/internal/handler/unit/favorite.go +++ b/internal/handler/unit/favorite.go @@ -26,7 +26,8 @@ func favorite(ctx *gin.Context) { FavoriteFlag: req.FavoriteFlag != 0, } _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). - ID(req.UnitOwningUserID).Cols("favorite_flag").Update(&data) + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, req.UnitOwningUserID). + Cols("favorite_flag").Update(&data) if ss.CheckErr(err) { return } diff --git a/internal/handler/unit/removableskillequipment.go b/internal/handler/unit/removableskillequipment.go index 415abdb..9277449 100644 --- a/internal/handler/unit/removableskillequipment.go +++ b/internal/handler/unit/removableskillequipment.go @@ -35,12 +35,21 @@ func removableSkillEquipment(ctx *gin.Context) { // 佩戴宝石 for _, v := range req.Equip { // fmt.Println("Equip:", v.UnitOwningUserID, v.UnitRemovableSkillID) + exists, err := ss.HasUserUnit(v.UnitOwningUserID) + if ss.CheckErr(err) { + return + } + if !exists { + ss.AbortWithStatus(http.StatusNotFound, honokautils.NewNotFoundContent(ctx.Request.URL.Path)) + return + } + data := unitschema.RemovableSkillEquipmentData{ UnitRemovableSkillId: v.UnitRemovableSkillID, UnitOwningUserID: v.UnitOwningUserID, UserID: ss.UserID, } - _, err := ss.UserEng.Table("user_unit_skill_equip").Insert(&data) + _, err = ss.UserEng.Table("user_unit_skill_equip").Insert(&data) if ss.CheckErr(err) { return } diff --git a/internal/handler/unit/sale.go b/internal/handler/unit/sale.go index 1d2f710..4fd1e4a 100644 --- a/internal/handler/unit/sale.go +++ b/internal/handler/unit/sale.go @@ -29,7 +29,11 @@ func sale(ctx *gin.Context) { salePrice := 1 // TODO: 从 unit_level_up_pattern_m 表获取实际价格 totalCoin += salePrice - _, unitData := ss.GetUserUnitInfo(id) + has, unitData := ss.GetUserUnitInfo(id) + if !has || unitData == nil { + ss.AbortWithStatus(http.StatusNotFound, honokautils.NewNotFoundContent(ctx.Request.URL.Path)) + return + } saleDetail = append(saleDetail, unitschema.Detail{ UnitOwningUserID: id, @@ -40,21 +44,21 @@ func sale(ctx *gin.Context) { // 卸载宝石 _, err = ss.UserEng.Table(new(usermodel.UserUnitSkillEquip)). - Where("unit_owning_user_id = ?", id).Delete() + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, id).Delete() if ss.CheckErr(err) { return } // 卸载饰品 _, err = ss.UserEng.Table(new(usermodel.UserAccessoryWear)). - Where("unit_owning_user_id = ?", id).Delete() + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, id).Delete() if ss.CheckErr(err) { return } // 移除卡片 _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). - Where("unit_owning_user_id = ?", id).Delete() + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, id).Delete() if ss.CheckErr(err) { return } diff --git a/internal/handler/unit/setdisplayrank.go b/internal/handler/unit/setdisplayrank.go index 76b748c..df16eb6 100644 --- a/internal/handler/unit/setdisplayrank.go +++ b/internal/handler/unit/setdisplayrank.go @@ -26,7 +26,8 @@ func setDisplayRank(ctx *gin.Context) { DisplayRank: req.DisplayRank, } _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). - ID(req.UnitOwningUserID).Cols("display_rank").Update(&data) + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, req.UnitOwningUserID). + Cols("display_rank").Update(&data) if ss.CheckErr(err) { return } diff --git a/internal/handler/unit/wearaccessory.go b/internal/handler/unit/wearaccessory.go index 1dcb9d7..823c34a 100644 --- a/internal/handler/unit/wearaccessory.go +++ b/internal/handler/unit/wearaccessory.go @@ -49,6 +49,15 @@ func wearAccessory(ctx *gin.Context) { return } + exists, err = ss.HasUserUnit(v.UnitOwningUserID) + if ss.CheckErr(err) { + return + } + if !exists { + ss.CheckErr(errors.New("unit not found for user")) + return + } + data := unitschema.WearAccessoryData{ AccessoryOwningUserID: v.AccessoryOwningUserID, UnitOwningUserID: v.UnitOwningUserID, diff --git a/internal/session/accessory.go b/internal/session/accessory.go index ac5c664..b5fd81d 100644 --- a/internal/session/accessory.go +++ b/internal/session/accessory.go @@ -9,7 +9,7 @@ import ( func (ss *Session) GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.UserAccessoryWear) { wearData := usermodel.UserAccessoryWear{} has, err := ss.UserEng.Table(new(usermodel.UserAccessoryWear)). - Where("unit_owning_user_id = ?", unitOwningUserID).Get(&wearData) + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, unitOwningUserID).Get(&wearData) if ss.CheckErr(err) { return false, nil } @@ -18,9 +18,13 @@ func (ss *Session) GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID int) } func (ss *Session) GetUserAccessoryByAccessoryOwningUserID(accessoryOwningUserID int) (bool, *usermodel.UserAccessory) { + return ss.GetUserAccessoryByAccessoryOwningUserIDForUser(ss.UserID, accessoryOwningUserID) +} + +func (ss *Session) GetUserAccessoryByAccessoryOwningUserIDForUser(userID, accessoryOwningUserID int) (bool, *usermodel.UserAccessory) { accessoryData := usermodel.UserAccessory{} has, err := ss.UserEng.Table(new(usermodel.UserAccessory)). - Where("accessory_owning_user_id = ?", accessoryOwningUserID). + Where("user_id = ? AND accessory_owning_user_id = ?", userID, accessoryOwningUserID). Get(&accessoryData) if ss.CheckErr(err) { return false, nil @@ -30,7 +34,11 @@ func (ss *Session) GetUserAccessoryByAccessoryOwningUserID(accessoryOwningUserID } func (ss *Session) GetAccessoryByAccessoryOwningUserID(accessoryOwningUserID int) (bool, *accessorymodel.Accessory) { - has, userAccessoryData := ss.GetUserAccessoryByAccessoryOwningUserID(accessoryOwningUserID) + return ss.GetAccessoryByAccessoryOwningUserIDForUser(ss.UserID, accessoryOwningUserID) +} + +func (ss *Session) GetAccessoryByAccessoryOwningUserIDForUser(userID, accessoryOwningUserID int) (bool, *accessorymodel.Accessory) { + has, userAccessoryData := ss.GetUserAccessoryByAccessoryOwningUserIDForUser(userID, accessoryOwningUserID) if !has { return false, nil } diff --git a/internal/session/deck.go b/internal/session/deck.go index e3dde81..9a68722 100644 --- a/internal/session/deck.go +++ b/internal/session/deck.go @@ -26,7 +26,7 @@ func (ss *Session) GetUserDeckUnit(deckID int) []usermodel.UserDeckUnit { unitData := []usermodel.UserDeckUnit{} err = ss.UserEng.Table("user_deck_unit"). - Where("user_deck_id = ?", deckData.ID).Find(&unitData) + Where("user_deck_id = ? AND user_id = ?", deckData.ID, ss.UserID).Find(&unitData) if ss.CheckErr(err) { return []usermodel.UserDeckUnit{} } diff --git a/internal/session/unit.go b/internal/session/unit.go index 8d23d97..9e54890 100644 --- a/internal/session/unit.go +++ b/internal/session/unit.go @@ -36,7 +36,7 @@ func (ss *Session) GetUnitInfo(unitID int) (bool, *unitmodel.CommonUnitData) { func (ss *Session) GetUserUnitInfo(unitOwningUserID int) (bool, *unitmodel.CommonUnitData) { var unitID int has, err := ss.UserEng.Table(new(usermodel.UserUnitData)). - Where("unit_owning_user_id = ?", unitOwningUserID). + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, unitOwningUserID). Cols("unit_id").Get(&unitID) if ss.CheckErr(err) { return false, nil @@ -49,10 +49,16 @@ func (ss *Session) GetUserUnitInfo(unitOwningUserID int) (bool, *unitmodel.Commo return ss.GetUnitInfo(unitID) } +func (ss *Session) HasUserUnit(unitOwningUserID int) (bool, error) { + return ss.UserEng.Table(new(usermodel.UserUnitData)). + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, unitOwningUserID). + Exist() +} + func (ss *Session) GetUserUnitSkillEquip(unitOwningUserID int) []usermodel.UserUnitSkillEquip { skill := []usermodel.UserUnitSkillEquip{} err := ss.UserEng.Table("user_unit_skill_equip"). - Where("unit_owning_user_id = ?", unitOwningUserID).Find(&skill) + Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, unitOwningUserID).Find(&skill) if ss.CheckErr(err) { return []usermodel.UserUnitSkillEquip{} }