파티 초대 accept와 deny 분리

This commit is contained in:
2023-09-08 16:09:12 +09:00
parent 3dde7ccaf5
commit a9b0cf2493

View File

@ -541,29 +541,6 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque
} }
} }
func (gp *groupParty) DenyPartyInvitation(w http.ResponseWriter, r *http.Request) {
var data struct {
Gid primitive.ObjectID `bson:"gid"`
Mid primitive.ObjectID `bson:"mid"`
}
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
logger.Println("DenyPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
gid := data.Gid
mid := data.Mid
gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result()
gd := groupDoc{
id: gid,
rh: gp.rh,
}
gd.removeMember(mid)
}
func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Request) { func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Request) {
var data struct { var data struct {
Mid primitive.ObjectID `bson:"mid"` Mid primitive.ObjectID `bson:"mid"`
@ -588,82 +565,6 @@ func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Reque
} }
} }
// LeaveParty : 그룹에서 나감 or 내보냄
// - type : 그룹 타입
// - 그룹 타입에 맞는 키(주로 _id)
// - member_id : 나갈 멤버의 아이디
func (gp *groupParty) LeaveParty(w http.ResponseWriter, r *http.Request) {
var data struct {
Gid primitive.ObjectID `bson:"gid"`
Mid primitive.ObjectID `bson:"mid"`
Tid string `bson:"tid"`
}
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
logger.Println("LeaveParty failed. ReadJsonDocumentFromBody returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
gid := data.Gid
mid := data.Mid
tid := data.Tid
gd := groupDoc{
id: gid,
rh: gp.rh,
}
var err error
if len(tid) > 0 {
if tid != gd.tid(mid) {
// mid가 incharge여야 한다. 그래야 tid를 쫓아낼 수 있음
incharge, err := gp.rh.JSONGet(gd.strid(), "$._incharge")
if err != nil {
logger.Println("LeaveParty failed. gp.rh.JSONGet returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
if !strings.Contains(incharge.(string), gd.tid(mid)) {
// incharge가 아니네?
logger.Println("LeaveParty failed. mid is not incharge")
w.WriteHeader(http.StatusBadRequest)
return
}
mid = midFromTid(gd.id, tid)
}
err = gd.removeMemberByTid(tid)
} else {
err = gd.removeMember(mid)
// 내가 나갔다
gp.rh.JSONDel(mid.Hex(), "$.party.id")
}
if err != nil {
logger.Println("LeaveParty failed. gd.removeMember returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
// mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: mid.Hex(),
Body: bson.M{"gid": gid},
Tag: []string{"GroupDocFull", gid.Hex()},
})
// gid에는 제거 메시지 보냄
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: "#" + gd.strid(),
Body: bson.M{
tid: bson.M{},
},
Tag: []string{"MemberDocFull"},
})
gp.leaveRoom(gid, mid)
}
func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson.M) error { func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson.M) error {
gd := &groupDoc{ gd := &groupDoc{
id: gid, id: gid,
@ -865,26 +766,78 @@ func (gp *groupParty) UpdatePartyDocumentDirect(ctx wshandler.ApiCallContext) {
gp.updatePartyDocument(gidobj, doc) gp.updatePartyDocument(gidobj, doc)
} }
// func (gp *groupParty) ClientMessageReceived(sender *wshandler.Sender, mt wshandler.WebSocketMessageType, message any) { func (gp *groupParty) LeaveParty(ctx wshandler.ApiCallContext) {
// if mt == wshandler.Disconnected { gids, _ := gp.rh.JSONGetString(ctx.CallBy.Accid.Hex(), "$.party.id")
// rooms := message.([]string)
// for _, roomname := range rooms {
// gp.memberDisconnected(roomname, sender.Accid)
// }
// } else if mt == wshandler.BinaryMessage {
// commandline := message.([]any)
// cmd := commandline[0].(string)
// args := commandline[1:]
// switch cmd {
// case "UpdatePartyMemberDocument":
// gidobj, _ := primitive.ObjectIDFromHex(args[0].(string))
// doc := args[1].(map[string]any)
// gp.updateMemberDocument(gidobj, sender.Accid, doc)
// case "UpdatePartyDocument": if len(gids) == 0 || len(gids[0]) == 0 {
// gidobj, _ := primitive.ObjectIDFromHex(args[0].(string)) return
// doc := args[1].(map[string]any) }
// gp.updatePartyDocument(gidobj, doc) // mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐
// } gidstr := gids[0]
// } gid, _ := primitive.ObjectIDFromHex(gidstr)
// } mid := ctx.CallBy.Accid
tid := ctx.Arguments[0].(string)
gd := groupDoc{
id: gid,
rh: gp.rh,
}
var err error
if len(tid) > 0 {
if tid != gd.tid(mid) {
// mid가 incharge여야 한다. 그래야 tid를 쫓아낼 수 있음
incharge, err := gp.rh.JSONGet(gd.strid(), "$._incharge")
if err != nil {
logger.Println("LeaveParty failed. gp.rh.JSONGet returns err :", err)
return
}
if !strings.Contains(incharge.(string), gd.tid(mid)) {
// incharge가 아니네?
logger.Println("LeaveParty failed. mid is not incharge")
return
}
mid = midFromTid(gd.id, tid)
}
err = gd.removeMemberByTid(tid)
} else {
err = gd.removeMember(mid)
// 내가 나갔다
gp.rh.JSONDel(mid.Hex(), "$.party.id")
}
if err != nil {
logger.Println("LeaveParty failed. gd.removeMember returns err :", err)
return
}
// mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: mid.Hex(),
Body: bson.M{"gid": gid},
Tag: []string{"GroupDocFull", gid.Hex()},
})
// gid에는 제거 메시지 보냄
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: "#" + gd.strid(),
Body: bson.M{
tid: bson.M{},
},
Tag: []string{"MemberDocFull"},
})
gp.leaveRoom(gid, mid)
}
func (gp *groupParty) DenyPartyInvitation(ctx wshandler.ApiCallContext) {
gid, _ := primitive.ObjectIDFromHex(ctx.Arguments[0].(string))
mid := ctx.CallBy.Accid
gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result()
gd := groupDoc{
id: gid,
rh: gp.rh,
}
gd.removeMember(mid)
}