feat: support group invite privacy verification
This commit is contained in:
+53
-23
@@ -3177,21 +3177,23 @@ func serveIMMePrivacy(wrt http.ResponseWriter, req *http.Request) {
|
||||
writeIMSuccess(wrt, req, userPrivacyPayload(settings))
|
||||
case http.MethodPatch:
|
||||
var body struct {
|
||||
AddMeMethods map[string]bool `json:"add_me_methods"`
|
||||
ProfileVisibility *string `json:"profile_visibility"`
|
||||
LastSeenVisibility *string `json:"last_seen_visibility"`
|
||||
ReadReceipts *bool `json:"read_receipts"`
|
||||
Version int `json:"version"`
|
||||
AddMeMethods map[string]bool `json:"add_me_methods"`
|
||||
ProfileVisibility *string `json:"profile_visibility"`
|
||||
LastSeenVisibility *string `json:"last_seen_visibility"`
|
||||
ReadReceipts *bool `json:"read_receipts"`
|
||||
GroupInviteVerification *bool `json:"group_invite_verification"`
|
||||
Version int `json:"version"`
|
||||
}
|
||||
if !decodeIMJSONBody(wrt, req, &body) {
|
||||
return
|
||||
}
|
||||
settings, err := store.Profiles.UpdatePrivacy(principal.TenantID, principal.Uid, types.UserPrivacyPatch{
|
||||
AddMeMethods: body.AddMeMethods,
|
||||
ProfileVisibility: body.ProfileVisibility,
|
||||
LastSeenVisibility: body.LastSeenVisibility,
|
||||
ReadReceipts: body.ReadReceipts,
|
||||
Version: body.Version,
|
||||
AddMeMethods: body.AddMeMethods,
|
||||
ProfileVisibility: body.ProfileVisibility,
|
||||
LastSeenVisibility: body.LastSeenVisibility,
|
||||
ReadReceipts: body.ReadReceipts,
|
||||
GroupInviteVerification: body.GroupInviteVerification,
|
||||
Version: body.Version,
|
||||
})
|
||||
if err != nil {
|
||||
writeIMRelationError(wrt, req, err)
|
||||
@@ -5351,8 +5353,24 @@ func serveIMGroupInvitations(wrt http.ResponseWriter, req *http.Request, topic s
|
||||
} else {
|
||||
idempotencyKey = invitationID
|
||||
}
|
||||
targetRequiresApproval := settings != nil && settings.JoinApproval
|
||||
if !targetRequiresApproval && store.Profiles != nil {
|
||||
privacy, privacyErr := store.Profiles.GetPrivacy(principal.TenantID, uid)
|
||||
if privacyErr != nil {
|
||||
if errors.Is(privacyErr, types.ErrNotFound) || errors.Is(privacyErr, types.ErrUnsupported) {
|
||||
privacyErr = nil
|
||||
}
|
||||
}
|
||||
if privacyErr != nil {
|
||||
item["status"] = "failed"
|
||||
item["reason"] = relationErrorReason(privacyErr)
|
||||
results = append(results, item)
|
||||
continue
|
||||
}
|
||||
targetRequiresApproval = privacy != nil && privacy.GroupInviteVerification
|
||||
}
|
||||
joinRequestID := ""
|
||||
if settings != nil && settings.JoinApproval {
|
||||
if targetRequiresApproval {
|
||||
joinRequestID = "gjr_" + store.Store.GetUidString()
|
||||
}
|
||||
inv, err := store.GroupBusiness.CreateInvitation(principal.TenantID, &types.GroupInvitation{
|
||||
@@ -5376,7 +5394,7 @@ func serveIMGroupInvitations(wrt http.ResponseWriter, req *http.Request, topic s
|
||||
continue
|
||||
}
|
||||
item["invitation_id"] = inv.InvitationID
|
||||
item["status"] = inv.Status
|
||||
item["status"] = groupInvitationDisplayStatus(inv)
|
||||
item["expires_at"] = inv.ExpiresAt.Format(time.RFC3339Nano)
|
||||
if inv.JoinRequestID != "" {
|
||||
item["join_request_id"] = inv.JoinRequestID
|
||||
@@ -7112,7 +7130,7 @@ func groupInvitationPayload(inv *types.GroupInvitation) map[string]any {
|
||||
"topic": inv.Topic,
|
||||
"inviter_id": inv.InviterUserID.UserId(),
|
||||
"target_user_id": inv.TargetUserID.UserId(),
|
||||
"status": inv.Status,
|
||||
"status": groupInvitationDisplayStatus(inv),
|
||||
"result": inv.Result,
|
||||
"expires_at": inv.ExpiresAt.Format(time.RFC3339Nano),
|
||||
}
|
||||
@@ -7125,6 +7143,16 @@ func groupInvitationPayload(inv *types.GroupInvitation) map[string]any {
|
||||
return data
|
||||
}
|
||||
|
||||
func groupInvitationDisplayStatus(inv *types.GroupInvitation) string {
|
||||
if inv == nil {
|
||||
return ""
|
||||
}
|
||||
if inv.Status == types.GroupInvitationStatusPending && strings.TrimSpace(inv.JoinRequestID) != "" {
|
||||
return types.GroupInvitationStatusPendingApproval
|
||||
}
|
||||
return inv.Status
|
||||
}
|
||||
|
||||
func groupFilePayloads(files []types.GroupFile) []map[string]any {
|
||||
items := make([]map[string]any, 0, len(files))
|
||||
for i := range files {
|
||||
@@ -9210,17 +9238,19 @@ func validIMSecurityChallengeScene(scene string) bool {
|
||||
|
||||
func userPrivacyPayload(settings *types.UserPrivacySettings) map[string]any {
|
||||
return map[string]any{
|
||||
"add_me_methods": settings.AddMeMethods,
|
||||
"profile_visibility": settings.ProfileVisibility,
|
||||
"last_seen_visibility": settings.LastSeenVisibility,
|
||||
"read_receipts": settings.ReadReceipts,
|
||||
"version": settings.Version,
|
||||
"updated_at": settings.UpdatedAt.UTC().Format(time.RFC3339Nano),
|
||||
"add_me_methods": settings.AddMeMethods,
|
||||
"profile_visibility": settings.ProfileVisibility,
|
||||
"last_seen_visibility": settings.LastSeenVisibility,
|
||||
"read_receipts": settings.ReadReceipts,
|
||||
"group_invite_verification": settings.GroupInviteVerification,
|
||||
"version": settings.Version,
|
||||
"updated_at": settings.UpdatedAt.UTC().Format(time.RFC3339Nano),
|
||||
"editable": map[string]any{
|
||||
"add_me_methods": true,
|
||||
"profile_visibility": true,
|
||||
"last_seen_visibility": true,
|
||||
"read_receipts": true,
|
||||
"add_me_methods": true,
|
||||
"profile_visibility": true,
|
||||
"last_seen_visibility": true,
|
||||
"read_receipts": true,
|
||||
"group_invite_verification": true,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user