Skip to content

Commit 8743dd4

Browse files
authored
Merge pull request #129 from PretendoNetwork/chore/cleanup-post-logic
Chore: cleanup posting logic
2 parents 7a2e016 + e96c10a commit 8743dd4

2 files changed

Lines changed: 60 additions & 15 deletions

File tree

  • apps
    • juxtaposition-ui/src/services/juxt-web/routes/console
    • miiverse-api/src/services/api/routes

apps/juxtaposition-ui/src/services/juxt-web/routes/console/posts.js

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,32 @@ router.post('/:post_id/report', upload.none(), async function (req, res) {
190190
return res.redirect(`/posts/${post.id}`);
191191
});
192192

193+
function canPost(community, userSettings, parentPost, user) {
194+
const isReply = !!parentPost;
195+
const isPublicPostableCommunity = community.type >= 0 && community.type < 2;
196+
const isOpenCommunity = community.permissions.open;
197+
198+
const isCommunityAdmin = (community.admins ?? []).includes(user.pid);
199+
const isUserLimitedFromPosting = userSettings.account_status !== 0;
200+
const hasAccessLevelRequirement = isReply
201+
? user.accessLevel >= community.permissions.minimum_new_comment_access_level
202+
: user.accessLevel >= community.permissions.minimum_new_post_access_level;
203+
204+
if (isUserLimitedFromPosting) {
205+
return false;
206+
}
207+
208+
if (isCommunityAdmin) {
209+
return true; // admins can always post (if not limited)
210+
}
211+
212+
if (!hasAccessLevelRequirement) {
213+
return false;
214+
}
215+
216+
return isReply ? isOpenCommunity : isPublicPostableCommunity;
217+
}
218+
193219
async function newPost(req, res) {
194220
const userSettings = await database.getUserSettings(req.pid);
195221
let parentPost = null;
@@ -211,13 +237,9 @@ async function newPost(req, res) {
211237
}
212238
}
213239

214-
if (!(community.admins && community.admins.indexOf(req.pid) !== -1 && userSettings.account_status === 0)) {
215-
if (community.type >= 2 || req.user.access_level < community.permissions.minimum_new_post_access_level) {
216-
if (!(parentPost && req.user.access_level >= community.permissions.minimum_new_comment_access_level && community.permissions.open)) {
217-
res.status(403);
218-
return res.redirect(`/titles/${community.olive_community_id}/new`);
219-
}
220-
}
240+
if (!canPost(community, userSettings, parentPost, req.user)) {
241+
res.status(403);
242+
return res.redirect(`/titles/${community.olive_community_id}/new`);
221243
}
222244

223245
let painting = '';

apps/miiverse-api/src/services/api/routes/posts.ts

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import { config } from '@/config';
2323
import { ApiErrorCode, badRequest, serverError } from '@/errors';
2424
import type { PostRepliesResult } from '@/types/miiverse/post';
2525
import type { HydratedPostDocument } from '@/types/mongoose/post';
26+
import type { HydratedCommunityDocument } from '@/types/mongoose/community';
27+
import type { HydratedSettingsDocument } from '@/types/mongoose/settings';
28+
import type { GetUserDataResponse } from '@pretendonetwork/grpc/account/get_user_data_rpc';
2629

2730
const newPostSchema = z.object({
2831
community_id: z.string().optional(),
@@ -190,6 +193,32 @@ router.get('/', async function (request: express.Request, response: express.Resp
190193
}).end({ pretty: true, allowEmpty: true }));
191194
});
192195

196+
function canPost(community: HydratedCommunityDocument, userSettings: HydratedSettingsDocument, parentPost: HydratedPostDocument | null, user: GetUserDataResponse): boolean {
197+
const isReply = !!parentPost;
198+
const isPublicPostableCommunity = community.type >= 0 && community.type < 2;
199+
const isOpenCommunity = community.permissions.open;
200+
201+
const isCommunityAdmin = (community.admins ?? []).includes(user.pid);
202+
const isUserLimitedFromPosting = userSettings.account_status !== 0;
203+
const hasAccessLevelRequirement = isReply
204+
? user.accessLevel >= community.permissions.minimum_new_comment_access_level
205+
: user.accessLevel >= community.permissions.minimum_new_post_access_level;
206+
207+
if (isUserLimitedFromPosting) {
208+
return false;
209+
}
210+
211+
if (isCommunityAdmin) {
212+
return true; // admins can always post (if not limited)
213+
}
214+
215+
if (!hasAccessLevelRequirement) {
216+
return false;
217+
}
218+
219+
return isReply ? isOpenCommunity : isPublicPostableCommunity;
220+
}
221+
193222
async function newPost(request: express.Request, response: express.Response): Promise<void> {
194223
response.type('application/xml');
195224

@@ -264,14 +293,8 @@ async function newPost(request: express.Request, response: express.Response): Pr
264293
}
265294
}
266295

267-
// TODO - Clean this up
268-
// * Nesting this because of how many checks there are, extremely unreadable otherwise
269-
if (!(community.admins && community.admins.indexOf(request.pid) !== -1 && userSettings.account_status === 0)) {
270-
if (community.type >= 2 || request.user.accessLevel < community.permissions.minimum_new_post_access_level) {
271-
if (!(parentPost && request.user.accessLevel >= community.permissions.minimum_new_comment_access_level && community.permissions.open)) {
272-
return badRequest(response, ApiErrorCode.NOT_ALLOWED, 403);
273-
}
274-
}
296+
if (!canPost(community, userSettings, parentPost, request.user)) {
297+
return badRequest(response, ApiErrorCode.NOT_ALLOWED, 403);
275298
}
276299

277300
let miiFace = 'normal_face.png';

0 commit comments

Comments
 (0)