forked from parse-community/parse-server-example
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPOFriendRelation.js
More file actions
148 lines (134 loc) · 4.45 KB
/
POFriendRelation.js
File metadata and controls
148 lines (134 loc) · 4.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
var ColumnUtil = require('./ColumnUtil.js');
Parse.Cloud.beforeSave("POFriendRelation", function(request, response) {
ColumnUtil.mirrorColumnsForObject(request.object, "friendUserId", "friendUser");
ColumnUtil.mirrorColumnsForObject(request.object, "userId", "user");
var friendUser = request.object.get("friendUser");
var saveOptions = {
success: function(user) {
response.success();
},
error: function(user, error) {
response.error("Unable to save the user");
}
}
function addAndRemoveChannels(addedChannel, removedChannel) {
request.user.remove("channels", removedChannel);
request.user.save(null, {
success: function(user) {
request.user.addUnique("channels", addedChannel);
request.user.save(null, saveOptions);
},
error: function(user, error) {
response.error("Unable to save the user");
}
});
}
function updateChannelsIfNeeded() {
if (request.object.dirtyKeys().indexOf("driveNotification") > -1 && request.user) {
var driveChannel = "drive-" + friendUser.id;
var friendChannel = "friend-" + friendUser.id;
if (request.object.get("driveNotification")) {
addAndRemoveChannels(driveChannel, friendChannel);
} else {
addAndRemoveChannels(friendChannel, driveChannel);
}
} else {
response.success();
}
}
// when the friend relation is new
if (!request.object.existed()) {
// give the requesting user access to the requested user since the inverse already exists
if (request.user.id != friendUser.id) {
var roleQuery = new Parse.Query(Parse.Role);
roleQuery.equalTo("name", "user-" + request.user.id);
roleQuery.first({
success: function(role) {
Parse.Cloud.useMasterKey();
role.relation("users").add(friendUser);
role.save(null, {
success: function(user) {
updateChannelsIfNeeded();
},
error: function(user, error) {
response.error("Unable to save the role");
}
});
},
error: function(error) {
console.log("Failed to save role for friend relation with error " + error.code + " : " + error.message);
response.error("Unable to find the role");
},
useMasterKey:true
});
} else {
response.success();
}
}
else {
updateChannelsIfNeeded();
}
});
Parse.Cloud.afterSave("POFriendRelation", function(request) {
var user = request.object.get("user");
var friendUser = request.object.get("friendUser");
//destroy all friend requests associated with a relationship when the relationship is created
var query = new Parse.Query("POFriendRequest");
query.equalTo("requestingUser", user);
query.equalTo("requestedUser", friendUser);
query.find({
success: function(results) {
if (results.length > 0) {
for (var i = 0; i < results.length; i++) {
results[i].destroy();
}
}
var friendQuery = new Parse.Query("POFriendRequest");
friendQuery.equalTo("requestingUser", friendUser);
friendQuery.equalTo("requestedUser", user);
friendQuery.find({
success: function(results) {
if (results.length > 0) {
for (var i = 0; i < results.length; i++) {
results[i].destroy();
}
}
},
error: function(error) {
console.log("error when destroying friend request");
}
});
},
error: function(error) {
console.log("error when destroying friend request");
}
});
});
Parse.Cloud.afterDelete("POFriendRelation", function(request) {
//when someone removes a friend we need to delete read access both ways.
var userPointer = request.object.get("user");
var friendUserPointer = request.object.get("friendUser");
userPointer.fetch({
success: function(user) {
var roleQuery = new Parse.Query(Parse.Role);
roleQuery.equalTo("name", "user-" + user.id);
roleQuery.first({
success: function(role) {
Parse.Cloud.useMasterKey();
role.relation("users").remove(friendUserPointer);
role.save();
},
error: function(error) {
console.log("Failed to remove role for friend relation with error " + error.code + " : " + error.message);
},
useMasterKey:true
});
user.remove("channels", "friend-" + friendUserPointer.id);
user.save(null, {useMasterKey:true});
},
error: function(myObject, error) {
console.error("Unable to find user " + userPointer.id + " " + error.code + " : " + error.message);
},
useMasterKey: true
});
});