Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import morgan from 'morgan';
import {
adminRoutes,
avatarRoutes,
blackmarketRoutes,
blockRoutes,
clubRoutes,
colonyRoutes,
Expand Down Expand Up @@ -63,6 +64,7 @@ app.use('/api/messageboard', messageboardRoutes);
app.use('/api/admin', adminRoutes);
app.use('/api/inbox', inboxRoutes);
app.use('/api/mall', mallRoutes);
app.use('/api/blackmarket', blackmarketRoutes);
app.use('/api/fleamarket', fleamarketRoutes);
app.use('/api/club', clubRoutes);
app.use('/api/vote', voteRoutes);
Expand Down
41 changes: 41 additions & 0 deletions api/src/controllers/blackmarket.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { Request, Response } from 'express';
import { Container } from 'typedi';

import {
MemberService,
BlackMarketService,
} from '../services';

class BlackmarketController {
constructor(
private memberService: MemberService,
private blackMarketService: BlackMarketService,

) {}

public async canAdmin(request: Request, response: Response): Promise<void> {
const { apitoken } = request.headers;

try {
const session = this.memberService.decodeMemberToken(<string>apitoken);
if (!session || !(await this.blackMarketService.canAdmin(session.id))) {
response.status(400).json({
error: 'Invalid or missing token or access denied.',
});
return;
}
response.status(200).json({ status: 'success' });
} catch (error) {
console.error(error);
response.status(400).json({ error });
}
}


}
const memberService = Container.get(MemberService);
const blackmarketService = Container.get(BlackMarketService);
export const blackmarketController = new BlackmarketController(
memberService,
blackmarketService,
);
1 change: 1 addition & 0 deletions api/src/controllers/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './admin.controller';
export * from './avatar.controller';
export * from './blackmarket.controller';
export * from './block.controller';
export * from './club.controller';
export * from './colony.controller';
Expand Down
21 changes: 19 additions & 2 deletions api/src/controllers/object-instance.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { Request, Response } from 'express';
import { Container } from 'typedi';
import { MemberService, ObjectInstanceService, PlaceService, FleaMarketService } from '../services';
import {
MemberService,
ObjectInstanceService,
PlaceService,
FleaMarketService,
BlackMarketService } from '../services';
import * as badwords from 'badwords-list';

class ObjectInstanceController {
Expand All @@ -9,6 +14,7 @@ class ObjectInstanceController {
private placeService: PlaceService,
private memberService: MemberService,
private fleaMarketService: FleaMarketService,
private blackMarketService: BlackMarketService,
) {}

/** Stores the position of an object instance in the database */
Expand Down Expand Up @@ -36,6 +42,9 @@ class ObjectInstanceController {
if(place.slug === 'fleamarket'){
adminStatus = await this.fleaMarketService.canAdmin(session.id);
}
if(place.slug === 'blackmarket'){
adminStatus = await this.blackMarketService.canAdmin(session.id);
}
if (!adminStatus && objectInstance.member_id != session.id) {
throw new Error('Not the owner of this object');
}
Expand Down Expand Up @@ -74,7 +83,10 @@ class ObjectInstanceController {
const objectInstance = await this.objectInstanceService.find(id);
const place = await this.placeService.findById(Number.parseInt(request.body.placeId));

if (place.slug !== 'fleamarket' && place.member_id != session.id) {
if (
place.slug !== 'fleamarket' &&
place.slug !== 'blackmarket' &&
place.member_id != session.id) {
throw new Error('Not the owner of this place');
}

Expand Down Expand Up @@ -235,6 +247,9 @@ class ObjectInstanceController {
if(place.slug === 'fleamarket'){
adminStatus = await this.fleaMarketService.canAdmin(session.id);
}
if(place.slug === 'blackmarket'){
adminStatus = await this.blackMarketService.canAdmin(session.id);
}

if (!adminStatus && objectInstance.member_id != session.id) {
throw new Error('Not the owner of this object');
Expand All @@ -251,9 +266,11 @@ const objectInstanceService = Container.get(ObjectInstanceService);
const placeService = Container.get(PlaceService);
const memberService = Container.get(MemberService);
const fleaMarketService = Container.get(FleaMarketService);
const blackMarketService = Container.get(BlackMarketService);
export const objectInstanceController = new ObjectInstanceController(
objectInstanceService,
placeService,
memberService,
fleaMarketService,
blackMarketService,
);
14 changes: 14 additions & 0 deletions api/src/routes/blackmarket.routes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import Router from 'express';

import { blackmarketController } from '../controllers';

/**
* This file sets up routing for home routes.
* @note All paths used here will be prepended with `/api/home`.
*/

const blackmarketRoutes = Router();
blackmarketRoutes.get('/can_admin', (request, response) =>
blackmarketController.canAdmin(request, response));

export { blackmarketRoutes };
1 change: 1 addition & 0 deletions api/src/routes/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './admin.routes';
export * from './avatar.routes';
export * from './blackmarket.routes';
export * from './block.routes';
export * from './club.routes';
export * from './colony.routes';
Expand Down
31 changes: 31 additions & 0 deletions api/src/services/blackmarket/blackmarket.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Service } from 'typedi';

import {
RoleAssignmentRepository,
RoleRepository,
} from '../../repositories';

/** Service for dealing with the flea market */
@Service()
export class BlackMarketService {
constructor(
private roleAssignmentRepository: RoleAssignmentRepository,
private roleRepository: RoleRepository,
) {}

public async canAdmin(memberId: number): Promise<boolean> {
const roleAssignments = await this.roleAssignmentRepository.getByMemberId(memberId);
if (
roleAssignments.find(assignment => {
return [
this.roleRepository.roleMap.Admin,
this.roleRepository.roleMap.BlackMarketDeputy,
this.roleRepository.roleMap.BlackMarketChief,
].includes(assignment.role_id);
})
) {
return true;
}
return false;
}
}
1 change: 1 addition & 0 deletions api/src/services/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './admin/admin.services';
export * from './avatar/avatar.service';
export * from './blackmarket/blackmarket.service';
export * from './block/block.service';
export * from './club/club.service';
export * from './colony/colony.service';
Expand Down
Loading