차단 목록 관리 완료

This commit is contained in:
2023-09-21 16:52:41 +09:00
parent f9cec4cef3
commit a4c8b849fa
4 changed files with 94 additions and 108 deletions

View File

@ -28,7 +28,8 @@ type invitationDoc struct {
FromAlias string `bson:"falias,omitempty" json:"from"`
ToAlias string `bson:"talias,omitempty" json:"to"`
Timestamp int64 `bson:"ts" json:"ts"`
Deleted bool `bson:"deleted,omitempty" json:"deleted,omitempty"`
Denied bool `bson:"denied,omitempty" json:"denied,omitempty"`
Canceled bool `bson:"canceled,omitempty" json:"canceled,omitempty"`
Blocked bool `bson:"blocked,omitempty" json:"-"` // From은 To에 의해 차단된 상태를 표시
}
@ -45,7 +46,7 @@ func makeInvitation(ctx context.Context, s *Social, f *friends) (*invitation, er
// 내가 받은거
if err := s.mongoClient.MakeIndices(invitation_collection_name, map[string]bson.D{
"tots": {{Key: "to", Value: 1}, {Key: "ts", Value: -1}, {Key: "blocked", Value: 1}},
"tots": {{Key: "to", Value: 1}, {Key: "ts", Value: -1}},
}); err != nil {
return nil, err
}
@ -67,15 +68,17 @@ func (iv *invitation) QueryInvitations(ctx wshandler.ApiCallContext) {
if err := iv.mongoClient.FindAllAs(invitation_collection_name, bson.M{
"to": ctx.CallBy.Accid,
"ts": bson.M{"$gt": queryfrom},
"blocked": false,
"blocked": bson.M{"$exists": false},
"denied": bson.M{"$exists": false},
}, &receives, options.Find().SetHint("tots")); err != nil {
logger.Println("QueryInvitations failed. FindAllAs err :", err)
}
var sents []*invitationDoc
if err := iv.mongoClient.FindAllAs(invitation_collection_name, bson.M{
"from": ctx.CallBy.Accid,
"ts": bson.M{"$gt": queryfrom},
"from": ctx.CallBy.Accid,
"ts": bson.M{"$gt": queryfrom},
"canceled": bson.M{"$exists": false},
}, &sents, options.Find().SetHint("fromts")); err != nil {
logger.Println("QueryInvitations failed. FindAllAs err :", err)
}
@ -92,45 +95,37 @@ func (iv *invitation) QueryInvitations(ctx wshandler.ApiCallContext) {
func (iv *invitation) CancelInvitation(ctx wshandler.ApiCallContext) {
// ctx.CallBy.Accid
id, _ := primitive.ObjectIDFromHex(ctx.Arguments[0].(string))
invId, _ := primitive.ObjectIDFromHex(ctx.Arguments[0].(string))
now := time.Now().UTC().Unix()
var ivdoc invitationDoc
if err := iv.mongoClient.FindOneAs(invitation_collection_name, bson.M{
"_id": id,
}, &ivdoc); err != nil {
logger.Println("CancelInvitation failed:", err)
return
}
if ivdoc.From != ctx.CallBy.Accid {
return
}
ivdoc.Deleted = true
if _, _, err := iv.mongoClient.Update(invitation_collection_name, bson.M{
"_id": id,
if err := iv.mongoClient.FindOneAndUpdateAs(invitation_collection_name, bson.M{
"_id": invId,
"from": bson.M{"$eq": ctx.CallBy.Accid},
}, bson.M{
"$set": bson.M{
"falias": "",
"deleted": true,
"ts": time.Now().UTC().Unix(),
"canceled": true,
"ts": now,
},
}); err != nil {
logger.Println("CancelInvitation failed:", err)
}, &ivdoc, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(false)); err != nil {
logger.Println("CancelInvitation failed :", err)
return
}
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: ivdoc.To.Hex(),
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
})
if ivdoc.Id.IsZero() {
return
}
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: ivdoc.From.Hex(),
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
})
if ivdoc.Blocked {
// 차단된 초대다. 초대한 사람은 차단된 상태를 모르기 때문에 이 초대는 삭제하고, 초대받은 사람한테는 보내지 않는다.
iv.mongoClient.Delete(invitation_collection_name, bson.M{"_id": invId})
} else {
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: ivdoc.To.Hex(),
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
})
}
}
func (iv *invitation) AcceptInvitation(ctx wshandler.ApiCallContext) {
@ -192,57 +187,31 @@ func (iv *invitation) AcceptInvitation(ctx wshandler.ApiCallContext) {
return
}
iv.mongoClient.Update(invitation_collection_name, bson.M{
"_id": invId,
}, bson.M{
"$set": bson.M{
"deleted": true,
"ts": now,
},
}, options.Update().SetUpsert(false))
iv.mongoClient.Delete(invitation_collection_name, bson.M{"_id": invId})
}
func (iv *invitation) DenyInvitation(ctx wshandler.ApiCallContext) {
invId, _ := primitive.ObjectIDFromHex(ctx.Arguments[0].(string))
now := time.Now().UTC().Unix()
var ivdoc invitationDoc
if err := iv.mongoClient.FindOneAs(invitation_collection_name, bson.M{
"_id": invId,
}, &ivdoc); err != nil {
logger.Println("AcceptInvitation failed:", err)
return
}
if ivdoc.Id != invId {
// 초대가 없다
return
}
if ivdoc.To != ctx.CallBy.Accid {
// 내가 받은 초대가 아니네?
return
}
now := time.Now().UTC().Unix()
ivdoc.Timestamp = now
ivdoc.Deleted = true
if _, _, err := iv.mongoClient.Update(invitation_collection_name, bson.M{
if err := iv.mongoClient.FindOneAndUpdateAs(invitation_collection_name, bson.M{
"_id": invId,
"to": bson.M{"$eq": ctx.CallBy.Accid},
}, bson.M{
"$set": bson.M{
"deleted": true,
"ts": now,
"denied": true,
"ts": now,
},
}, options.Update().SetUpsert(false)); err != nil {
}, &ivdoc, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(false)); err != nil {
logger.Println("DenyInvitation failed. addFriend(f2) err :", err)
return
}
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: ivdoc.To.Hex(),
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
})
if ivdoc.Id.IsZero() {
// 없다
return
}
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: ivdoc.From.Hex(),
@ -252,23 +221,13 @@ func (iv *invitation) DenyInvitation(ctx wshandler.ApiCallContext) {
}
func (iv *invitation) Trim(ctx wshandler.ApiCallContext) {
stringsTobjs := func(in []any) (out []primitive.ObjectID) {
for _, i := range in {
p, _ := primitive.ObjectIDFromHex(i.(string))
out = append(out, p)
}
return
}
ids := stringsTobjs(ctx.Arguments[0].([]any))
ids = append(ids, stringsTobjs(ctx.Arguments[1].([]any))...)
ids := stringsToObjs(ctx.Arguments[2].([]any))
if len(ids) > 0 {
if len(ids) == 1 {
iv.mongoClient.Delete(invitation_collection_name, bson.M{"_id": ids[0], "deleted": true})
iv.mongoClient.Delete(block_collection_name, bson.M{"_id": ids[0]})
} else {
iv.mongoClient.DeleteMany(invitation_collection_name, bson.D{
iv.mongoClient.DeleteMany(block_collection_name, bson.D{
{Key: "_id", Value: bson.M{"$in": ids}},
{Key: "deleted", Value: true},
})
}
}
@ -353,7 +312,7 @@ func (iv *invitation) Block(w http.ResponseWriter, r *http.Request) {
// 사실은 삭제가 아니지만 초대 삭제 알림. 나중에 쿼리해도 안나옴
iv.wsh.SendUpstreamMessage(&wshandler.UpstreamMessage{
Target: block.From.Hex(),
Body: []invitationDoc{{Id: id, Deleted: true, Timestamp: now}},
Body: []invitationDoc{{Id: id, Canceled: true, Timestamp: now}},
Tag: invitations_tag,
})
}
@ -376,6 +335,10 @@ func (iv *invitation) Unblock(ctx wshandler.ApiCallContext) {
"$set": bson.M{
"ts": now,
},
"$unset": bson.M{
"canceled": "",
"blocked": "",
},
}, &ivdoc, options.FindOneAndUpdate().SetUpsert(false).SetReturnDocument(options.After))
if err != nil {
logger.Println("Block failed:", err)
@ -385,10 +348,10 @@ func (iv *invitation) Unblock(ctx wshandler.ApiCallContext) {
if !ivdoc.Id.IsZero() {
// 받은 초대가 있었다.
// 나한테 알림
ivdoc.Canceled = false
iv.f.conns.writeMessage(ctx.CallBy.Accid, &wshandler.DownstreamMessage{
Alias: ctx.CallBy.Alias,
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
Body: []invitationDoc{ivdoc},
Tag: invitations_tag,
})
}
}