Skip to content
Merged
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ yarn-error.log
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
.idea/**/copilot.*

# Useless stuff that doesn't need to be shared
.eslintcache
2 changes: 1 addition & 1 deletion adonisrc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export default defineConfig({
() => import('@adonisjs/auth/auth_provider'),
() => import('@adonisjs/ally/ally_provider'),
() => import('@adonisjs/bouncer/bouncer_provider'),
() => import('@adonisjs/drive/drive_provider')
() => import('@adonisjs/drive/drive_provider'),
],

/*
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/auth_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export default class AuthController {
avatarUrl: socialUser.avatarUrl,
password: null,
permissions: UserGuard.build(), // TODO: Combine into constant of BASE_PERMISSIONS or sth idk
}
},
)

// Authenticate the session
Expand Down
16 changes: 8 additions & 8 deletions app/controllers/events_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import type { HttpContext } from '@adonisjs/core/http'
import Event from '#models/event/event'
import EventAdministrator from '#models/event/event_administrator'
import db from '@adonisjs/lucid/services/db'
import { EventAdminGuard, EventAdminPermissions } from '#utils/permissions'
import type { Mask } from '#utils/permissions'
import { EventAdminGuard } from '#utils/permissions'
import type { Mask , EventAdminPermissions } from '#utils/permissions'
import EventPolicy from '#policies/event_policy'
import { confirmationValidator } from '#validators/common'

Expand All @@ -36,7 +36,7 @@ export default class EventsController {
* Display a list of resource
*/
async index({}: HttpContext) {
return Event.query().where('status', 'ACTIVE');
return Event.query().where('status', 'ACTIVE')
}

/**
Expand Down Expand Up @@ -77,8 +77,8 @@ export default class EventsController {
*/
async update({ bouncer, params, request }: HttpContext) {
const payload = await request.validateUsing(updateEventValidator, {
meta: { eventSlug: params.id }
});
meta: { eventSlug: params.id },
})

const event = await Event.findByUuidOrSlug(params.id)
await bouncer.with(EventPolicy).authorize('edit', event)
Expand All @@ -97,9 +97,9 @@ export default class EventsController {
await request.validateUsing(confirmationValidator, {
meta: {
expectedConfirmation: event.slug,
confirmationMeta: 'event slug'
}
});
confirmationMeta: 'event slug',
},
})

await bouncer.with(EventPolicy).authorize('edit', event)

Expand Down
11 changes: 5 additions & 6 deletions app/controllers/hackathons_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ export default class HackathonsController {
* Show individual hackathon task record
*/
async showTask({ bouncer, params }: HttpContext) {

let hackathonTask = await HackathonTask.query()
.where('id', params.id)
.preload('task')
Expand Down Expand Up @@ -103,7 +102,7 @@ export default class HackathonsController {
if (existing)
return response.conflict({ message: 'User is already a jury member' })

if(!await Organization.belongsToEvent(payload.organizationId, event.id))
if (!await Organization.belongsToEvent(payload.organizationId, event.id))
return response.badRequest({ message: 'Organization does not belong to the event' })

const juryMember = await task.related('juryMembers').create({
Expand All @@ -125,7 +124,7 @@ export default class HackathonsController {

await bouncer.with(EventPolicy).authorize('view', event)

return juryMember;
return juryMember
}

/**
Expand All @@ -140,12 +139,12 @@ export default class HackathonsController {

const payload = await request.validateUsing(updateJuryMemberValidator)

if(!await Organization.belongsToEvent(payload.organizationId, event.id))
if (!await Organization.belongsToEvent(payload.organizationId, event.id))
return response.badRequest({ message: 'Organization does not belong to the event' })

juryMember.merge(payload)
await juryMember.save()
return juryMember;
return juryMember
}

/**
Expand All @@ -159,6 +158,6 @@ export default class HackathonsController {
await bouncer.with(EventPolicy).authorize('manageJuryMembers', event)

await juryMember.delete()
return response.noContent();
return response.noContent()
}
}
11 changes: 5 additions & 6 deletions app/controllers/organizations_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import Sponsor from '#models/sponsor'
import {
createOrganizationValidator,
createSponsorValidator,
updateOrganizationValidator
updateOrganizationValidator,
} from '#validators/organization'
import Task from '#models/task/task'

Expand All @@ -42,7 +42,7 @@ export default class OrganizationsController {

await bouncer.with(EventPolicy).authorize('view', event)

return event.related('organizations').query();
return event.related('organizations').query()
}

/**
Expand Down Expand Up @@ -101,7 +101,7 @@ export default class OrganizationsController {

await organization.delete()

return response.noContent();
return response.noContent()
}

/**
Expand Down Expand Up @@ -147,7 +147,7 @@ export default class OrganizationsController {

await bouncer.with(EventPolicy).authorize('view', event)

return sponsor;
return sponsor
}

/**
Expand All @@ -161,7 +161,6 @@ export default class OrganizationsController {
await bouncer.with(EventPolicy).authorize('manageSponsors', event)

await sponsor.delete()
return response.noContent();
return response.noContent()
}

}
2 changes: 1 addition & 1 deletion app/controllers/scores_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export default class ScoresController {
const task = await Task.findByUuidOrSlug(params.task_id)
await bouncer.with(TaskPolicy).authorize('view', task)

return await ScoringCriterion.query()
return ScoringCriterion.query()
.where('id', params.id)
.where('task_id', task.id)
.firstOrFail()
Expand Down
23 changes: 11 additions & 12 deletions app/controllers/tasks_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export default class TasksController {
.where('event_id', event.id)
.if(!canManage, (q) => q.where('status', 'ACTIVE'))

return Promise.all(tasks.map(async (task) => getTaskByType(task)));
return Promise.all(tasks.map(async (task) => getTaskByType(task)))
}

/**
Expand All @@ -69,7 +69,7 @@ export default class TasksController {
const task = await db.transaction(async (trx) => {
const newTask = await event.related('tasks').create(
Task.datesFromPayload({ status: 'DRAFT', autoregister: false, ...taskPayload }),
{ client: trx }
{ client: trx },
)

switch (newTask.taskType) {
Expand All @@ -83,22 +83,21 @@ export default class TasksController {

await HackathonTask.create(
{ taskId: newTask.id, requirementsDocumentUrl: requirementsDocumentUrl },
{ client: trx }
{ client: trx },
)
break
}
// Future task types go here
}

// Autoregister all teams to new task that is set to autoregister
if(newTask.autoregister) {
if (newTask.autoregister) {
const eventTeams = await event.related('teams').query()

for(const team of eventTeams)
for (const team of eventTeams)
await newTask.related('registrations').create({
teamId: team.id,
}, { client: trx })

}

return newTask
Expand All @@ -125,7 +124,7 @@ export default class TasksController {
await bouncer.with(TaskPolicy).authorize('edit', task)

const payload = await request.validateUsing(updateTaskValidator, {
meta: { taskSlug: task.slug }
meta: { taskSlug: task.slug },
})

task.merge(Task.datesFromPayload(payload))
Expand Down Expand Up @@ -159,11 +158,11 @@ export default class TasksController {
await bouncer.with(TeamPolicy).authorize('registerToTask', team)

// 2. Check if team belongs to the same event as the task
if(team.eventId !== task.eventId)
if (team.eventId !== task.eventId)
return response.badRequest({ message: 'Team does not belong to the same event as the task' })

// 4. Check if registration is open for the task
const now = DateTime.now();
const now = DateTime.now()

if (task.registrationStartAt && now < task.registrationStartAt)
return response.badRequest({ message: 'Registration for the task has not started yet' })
Expand All @@ -176,11 +175,11 @@ export default class TasksController {
await team.loadCount('members')
const memberCount = team.$extras.members_count

if(memberCount < event.minTeamSize || memberCount > event.maxTeamSize)
if (memberCount < event.minTeamSize || memberCount > event.maxTeamSize)
return response.badRequest({ message: `Team size must be between ${event.minTeamSize} and ${event.maxTeamSize}` })

// 6. Check if task is set to autoregister and if so, prevent manual registration
if(task.autoregister)
if (task.autoregister)
return response.badRequest({ message: 'Task is set to autoregister, manual registration is not allowed' })

// 7. Check if team is already registered to the task
Expand Down Expand Up @@ -212,6 +211,6 @@ export default class TasksController {
await bouncer.with(TeamPolicy).authorize('registerToTask', team)

await taskRegistration.delete()
return response.noContent();
return response.noContent()
}
}
46 changes: 23 additions & 23 deletions app/controllers/teams_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ import {
teamInvitationValidator,
updateTeamValidator,
} from '#validators/team'
import Team from "#models/team/team";
import Event from '#models/event/event';
import TeamPolicy from "#policies/team_policy";
import db from "@adonisjs/lucid/services/db";
import Team from '#models/team/team'
import Event from '#models/event/event'
import TeamPolicy from '#policies/team_policy'
import db from '@adonisjs/lucid/services/db'
import { TeamMemberGuard } from '#utils/permissions'
import EventPolicy from "#policies/event_policy";
import EventPolicy from '#policies/event_policy'
import { confirmationValidator, paramsIdValidator } from '#validators/common'
import { applyQueryFilters } from "#utils/query";
import Task from '#models/task/task';
import { generateMemorableToken, generateSecureToken, invitationValidity } from "#utils/teams";
import TeamInvitation from "#models/team/team_invitation";
import InvitationSent from "#events/invitation_sent";
import env from "#start/env";
import { applyQueryFilters } from '#utils/query'
import Task from '#models/task/task'
import { generateMemorableToken, generateSecureToken, invitationValidity } from '#utils/teams'
import TeamInvitation from '#models/team/team_invitation'
import InvitationSent from '#events/invitation_sent'
import env from '#start/env'

export default class TeamsController {
/**
Expand All @@ -56,8 +56,8 @@ export default class TeamsController {
{
request, response,
searchColumn: 'name',
allowedColumns: ['name', 'created_at']
}
allowedColumns: ['name', 'created_at'],
},
)
}

Expand All @@ -80,15 +80,15 @@ export default class TeamsController {
userId: auth.getUserOrFail().id,
permissions: TeamMemberGuard.allPermissions(),
},
{ client: trx }
{ client: trx },
)

// Autoregister to tasks
const autoregisterTasks = await Task.query()
.where('event_id', event.id)
.where('autoregister', true)

for(const task of autoregisterTasks)
for (const task of autoregisterTasks)
await task.related('registrations').create({
teamId: newTeam.id,
}, { client: trx })
Expand Down Expand Up @@ -120,8 +120,8 @@ export default class TeamsController {
const payload = await request.validateUsing(updateTeamValidator, {
meta: {
teamName: team.name,
eventId: team.eventId
}
eventId: team.eventId,
},
})

await bouncer.with(TeamPolicy).authorize('edit', team)
Expand All @@ -141,7 +141,7 @@ export default class TeamsController {
await request.validateUsing(confirmationValidator, {
meta: {
expectedConfirmation: team.name,
confirmationMeta: 'team name'
confirmationMeta: 'team name',
},
})

Expand Down Expand Up @@ -200,8 +200,8 @@ export default class TeamsController {
request, response,
searchColumn: 'teams.name',
allowedColumns: ['created_at', 'teams.name', 'token'],
defaultTable: 'team_invitations'
}
defaultTable: 'team_invitations',
},
)
}

Expand All @@ -211,7 +211,7 @@ export default class TeamsController {
data: {
...request.qs(),
params: request.params(),
}
},
})
const invitation = await TeamInvitation.query()
.where('token', params.id)
Expand All @@ -227,13 +227,13 @@ export default class TeamsController {

if (invitation.status === 'ACCEPTED') {
const team = await invitation.related('team').query().firstOrFail()
return await team.related('members').create(
return team.related('members').create(
{
userId: user.id,
// No permissions by default, admin must update them after the user joins.
permissions: TeamMemberGuard.build(),
},
{ client: trx }
{ client: trx },
)
}
})
Expand Down
2 changes: 1 addition & 1 deletion app/events/invitation_sent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
*/

import { BaseEvent } from '@adonisjs/core/events'
import TeamInvitation from "#models/team/team_invitation";
import type TeamInvitation from '#models/team/team_invitation'

export default class InvitationSent extends BaseEvent {
constructor(public invitation: TeamInvitation) {
Expand Down
Loading