diff --git a/src/controllers/DonationController.ts b/src/controllers/DonationController.ts index 9401694..9636000 100644 --- a/src/controllers/DonationController.ts +++ b/src/controllers/DonationController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { DonationIdsNotMatchingError, DonationNotFoundError } from '../errors/DonationErrors'; import { DonorNotFoundError } from '../errors/DonorErrors'; import { RunnerNotFoundError } from '../errors/RunnerErrors'; @@ -36,9 +36,16 @@ export class DonationController { @ResponseSchema(ResponseDonation, { isArray: true }) @ResponseSchema(ResponseDistanceDonation, { isArray: true }) @OpenAPI({ description: 'Lists all donations (fixed or distance based) from all donors.
This includes the donations\'s runner\'s distance ran(if distance donation).' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseDonations: ResponseDonation[] = new Array(); - const donations = await this.donationRepository.find({ relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] }); + let donations: Array; + + if (page) { + donations = await this.donationRepository.find({ relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'], skip: page * page_size, take: page_size }); + } else { + donations = await this.donationRepository.find({ relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] }); + } + donations.forEach(donation => { responseDonations.push(donation.toResponse()); }); diff --git a/src/controllers/DonorController.ts b/src/controllers/DonorController.ts index 4b0d508..577ffc1 100644 --- a/src/controllers/DonorController.ts +++ b/src/controllers/DonorController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { DonorHasDonationsError, DonorIdsNotMatchingError, DonorNotFoundError } from '../errors/DonorErrors'; import { CreateDonor } from '../models/actions/create/CreateDonor'; import { UpdateDonor } from '../models/actions/update/UpdateDonor'; @@ -25,9 +25,16 @@ export class DonorController { @Authorized("DONOR:GET") @ResponseSchema(ResponseDonor, { isArray: true }) @OpenAPI({ description: 'Lists all donor.
This includes the donor\'s current donation amount.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseDonors: ResponseDonor[] = new Array(); - const donors = await this.donorRepository.find({ relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] }); + let donors: Array; + + if (page) { + donors = await this.donorRepository.find({ relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'], skip: page * page_size, take: page_size }); + } else { + donors = await this.donorRepository.find({ relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] }); + } + donors.forEach(donor => { responseDonors.push(new ResponseDonor(donor)); }); diff --git a/src/controllers/GroupContactController.ts b/src/controllers/GroupContactController.ts index f6f6364..81e45c8 100644 --- a/src/controllers/GroupContactController.ts +++ b/src/controllers/GroupContactController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnection, getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnection, getConnectionManager } from 'typeorm'; import { GroupContactIdsNotMatchingError, GroupContactNotFoundError } from '../errors/GroupContactErrors'; import { RunnerGroupNotFoundError } from '../errors/RunnerGroupErrors'; import { CreateGroupContact } from '../models/actions/create/CreateGroupContact'; @@ -26,9 +26,16 @@ export class GroupContactController { @Authorized("CONTACT:GET") @ResponseSchema(ResponseGroupContact, { isArray: true }) @OpenAPI({ description: 'Lists all contacts.
This includes the contact\'s associated groups.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseContacts: ResponseGroupContact[] = new Array(); - const contacts = await this.contactRepository.find({ relations: ['groups', 'groups.parentGroup'] }); + let contacts: Array; + + if (page) { + contacts = await this.contactRepository.find({ relations: ['groups', 'groups.parentGroup'], skip: page * page_size, take: page_size }); + } else { + contacts = await this.contactRepository.find({ relations: ['groups', 'groups.parentGroup'] }); + } + contacts.forEach(contact => { responseContacts.push(contact.toResponse()); }); diff --git a/src/controllers/PermissionController.ts b/src/controllers/PermissionController.ts index 663343c..990ad62 100644 --- a/src/controllers/PermissionController.ts +++ b/src/controllers/PermissionController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { PermissionIdsNotMatchingError, PermissionNeedsPrincipalError, PermissionNotFoundError } from '../errors/PermissionErrors'; import { PrincipalNotFoundError } from '../errors/PrincipalErrors'; import { CreatePermission } from '../models/actions/create/CreatePermission'; @@ -27,9 +27,16 @@ export class PermissionController { @Authorized("PERMISSION:GET") @ResponseSchema(ResponsePermission, { isArray: true }) @OpenAPI({ description: 'Lists all permissions for all users and groups.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responsePermissions: ResponsePermission[] = new Array(); - const permissions = await this.permissionRepository.find({ relations: ['principal'] }); + let permissions: Array; + + if (page) { + permissions = await this.permissionRepository.find({ relations: ['principal'], skip: page * page_size, take: page_size }); + } else { + permissions = await this.permissionRepository.find({ relations: ['principal'] }); + } + permissions.forEach(permission => { responsePermissions.push(new ResponsePermission(permission)); }); diff --git a/src/controllers/RunnerCardController.ts b/src/controllers/RunnerCardController.ts index f671569..e4e246e 100644 --- a/src/controllers/RunnerCardController.ts +++ b/src/controllers/RunnerCardController.ts @@ -26,9 +26,16 @@ export class RunnerCardController { @Authorized("CARD:GET") @ResponseSchema(ResponseRunnerCard, { isArray: true }) @OpenAPI({ description: 'Lists all card.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseCards: ResponseRunnerCard[] = new Array(); - const cards = await this.cardRepository.find({ relations: ['runner', 'runner.group', 'runner.group.parentGroup'] }); + let cards: Array; + + if (page) { + cards = await this.cardRepository.find({ relations: ['runner', 'runner.group', 'runner.group.parentGroup'], skip: page * page_size, take: page_size }); + } else { + cards = await this.cardRepository.find({ relations: ['runner', 'runner.group', 'runner.group.parentGroup'] }); + } + cards.forEach(card => { responseCards.push(new ResponseRunnerCard(card)); }); diff --git a/src/controllers/RunnerController.ts b/src/controllers/RunnerController.ts index 745ba9e..e25dcd0 100644 --- a/src/controllers/RunnerController.ts +++ b/src/controllers/RunnerController.ts @@ -30,9 +30,16 @@ export class RunnerController { @Authorized("RUNNER:GET") @ResponseSchema(ResponseRunner, { isArray: true }) @OpenAPI({ description: 'Lists all runners from all teams/orgs.
This includes the runner\'s group and distance ran.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseRunners: ResponseRunner[] = new Array(); - const runners = await this.runnerRepository.find({ relations: ['scans', 'group', 'group.parentGroup', 'scans.track'] }); + let runners: Array; + + if (page) { + runners = await this.runnerRepository.find({ relations: ['scans', 'group', 'group.parentGroup', 'scans.track'], skip: page * page_size, take: page_size }); + } else { + runners = await this.runnerRepository.find({ relations: ['scans', 'group', 'group.parentGroup', 'scans.track'] }); + } + runners.forEach(runner => { responseRunners.push(new ResponseRunner(runner)); }); diff --git a/src/controllers/RunnerOrganizationController.ts b/src/controllers/RunnerOrganizationController.ts index 5cf4183..32bc508 100644 --- a/src/controllers/RunnerOrganizationController.ts +++ b/src/controllers/RunnerOrganizationController.ts @@ -1,6 +1,6 @@ import { Authorized, BadRequestError, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { RunnerOrganizationHasRunnersError, RunnerOrganizationHasTeamsError, RunnerOrganizationIdsNotMatchingError, RunnerOrganizationNotFoundError } from '../errors/RunnerOrganizationErrors'; import { CreateRunnerOrganization } from '../models/actions/create/CreateRunnerOrganization'; import { UpdateRunnerOrganization } from '../models/actions/update/UpdateRunnerOrganization'; @@ -29,13 +29,20 @@ export class RunnerOrganizationController { @Authorized("ORGANIZATION:GET") @ResponseSchema(ResponseRunnerOrganization, { isArray: true }) @OpenAPI({ description: 'Lists all organizations.
This includes their address, contact and teams (if existing/associated).' }) - async getAll() { - let responseTeams: ResponseRunnerOrganization[] = new Array(); - const runners = await this.runnerOrganizationRepository.find({ relations: ['contact', 'teams'] }); - runners.forEach(runner => { - responseTeams.push(new ResponseRunnerOrganization(runner)); + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { + let responseOrgs: ResponseRunnerOrganization[] = new Array(); + let orgs: Array; + + if (page) { + orgs = await this.runnerOrganizationRepository.find({ relations: ['contact', 'teams'], skip: page * page_size, take: page_size }); + } else { + orgs = await this.runnerOrganizationRepository.find({ relations: ['contact', 'teams'] }); + } + + orgs.forEach(org => { + responseOrgs.push(new ResponseRunnerOrganization(org)); }); - return responseTeams; + return responseOrgs; } @Get('/:id') diff --git a/src/controllers/RunnerTeamController.ts b/src/controllers/RunnerTeamController.ts index 7b0059d..e363217 100644 --- a/src/controllers/RunnerTeamController.ts +++ b/src/controllers/RunnerTeamController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { RunnerTeamHasRunnersError, RunnerTeamIdsNotMatchingError, RunnerTeamNotFoundError } from '../errors/RunnerTeamErrors'; import { CreateRunnerTeam } from '../models/actions/create/CreateRunnerTeam'; import { UpdateRunnerTeam } from '../models/actions/update/UpdateRunnerTeam'; @@ -27,11 +27,18 @@ export class RunnerTeamController { @Authorized("TEAM:GET") @ResponseSchema(ResponseRunnerTeam, { isArray: true }) @OpenAPI({ description: 'Lists all teams.
This includes their parent organization and contact (if existing/associated).' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseTeams: ResponseRunnerTeam[] = new Array(); - const runners = await this.runnerTeamRepository.find({ relations: ['parentGroup', 'contact'] }); - runners.forEach(runner => { - responseTeams.push(new ResponseRunnerTeam(runner)); + let teams: Array; + + if (page) { + teams = await this.runnerTeamRepository.find({ relations: ['parentGroup', 'contact'], skip: page * page_size, take: page_size }); + } else { + teams = await this.runnerTeamRepository.find({ relations: ['parentGroup', 'contact'] }); + } + + teams.forEach(team => { + responseTeams.push(new ResponseRunnerTeam(team)); }); return responseTeams; } diff --git a/src/controllers/ScanController.ts b/src/controllers/ScanController.ts index 847d033..5ffa5d3 100644 --- a/src/controllers/ScanController.ts +++ b/src/controllers/ScanController.ts @@ -34,9 +34,16 @@ export class ScanController { @ResponseSchema(ResponseScan, { isArray: true }) @ResponseSchema(ResponseTrackScan, { isArray: true }) @OpenAPI({ description: 'Lists all scans (normal or track) from all runners.
This includes the scan\'s runner\'s distance ran.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseScans: ResponseScan[] = new Array(); - const scans = await this.scanRepository.find({ relations: ['runner', 'track'] }); + let scans: Array; + + if (page) { + scans = await this.scanRepository.find({ relations: ['runner', 'track'], skip: page * page_size, take: page_size }); + } else { + scans = await this.scanRepository.find({ relations: ['runner', 'track'] }); + } + scans.forEach(scan => { responseScans.push(scan.toResponse()); }); diff --git a/src/controllers/ScanStationController.ts b/src/controllers/ScanStationController.ts index 80aa6e3..f64605b 100644 --- a/src/controllers/ScanStationController.ts +++ b/src/controllers/ScanStationController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { ScanStationHasScansError, ScanStationIdsNotMatchingError, ScanStationNotFoundError } from '../errors/ScanStationErrors'; import { TrackNotFoundError } from '../errors/TrackErrors'; import { CreateScanStation } from '../models/actions/create/CreateScanStation'; @@ -26,9 +26,16 @@ export class ScanStationController { @Authorized("STATION:GET") @ResponseSchema(ResponseScanStation, { isArray: true }) @OpenAPI({ description: 'Lists all stations.
This includes their associated tracks.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseStations: ResponseScanStation[] = new Array(); - const stations = await this.stationRepository.find({ relations: ['track'] }); + let stations: Array; + + if (page) { + stations = await this.stationRepository.find({ relations: ['track'], skip: page * page_size, take: page_size }); + } else { + stations = await this.stationRepository.find({ relations: ['track'] }); + } + stations.forEach(station => { responseStations.push(station.toResponse()); }); diff --git a/src/controllers/StatsClientController.ts b/src/controllers/StatsClientController.ts index 4716909..1447ac3 100644 --- a/src/controllers/StatsClientController.ts +++ b/src/controllers/StatsClientController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { StatsClientNotFoundError } from '../errors/StatsClientErrors'; import { TrackNotFoundError } from "../errors/TrackErrors"; import { CreateStatsClient } from '../models/actions/create/CreateStatsClient'; @@ -24,9 +24,16 @@ export class StatsClientController { @Authorized("STATSCLIENT:GET") @ResponseSchema(ResponseStatsClient, { isArray: true }) @OpenAPI({ description: 'Lists all stats clients. Please remember that the key can only be viewed on creation.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseClients: ResponseStatsClient[] = new Array(); - const clients = await this.clientRepository.find(); + let clients: Array; + + if (page) { + clients = await this.clientRepository.find({ skip: page * page_size, take: page_size }); + } else { + clients = await this.clientRepository.find(); + } + clients.forEach(clients => { responseClients.push(new ResponseStatsClient(clients)); }); diff --git a/src/controllers/TrackController.ts b/src/controllers/TrackController.ts index 6ea2907..15ade97 100644 --- a/src/controllers/TrackController.ts +++ b/src/controllers/TrackController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { TrackHasScanStationsError, TrackIdsNotMatchingError, TrackLapTimeCantBeNegativeError, TrackNotFoundError } from "../errors/TrackErrors"; import { CreateTrack } from '../models/actions/create/CreateTrack'; import { UpdateTrack } from '../models/actions/update/UpdateTrack'; @@ -25,9 +25,17 @@ export class TrackController { @Authorized("TRACK:GET") @ResponseSchema(ResponseTrack, { isArray: true }) @OpenAPI({ description: 'Lists all tracks.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseTracks: ResponseTrack[] = new Array(); - const tracks = await this.trackRepository.find(); + let tracks: Array; + + if (page) { + tracks = await this.trackRepository.find({ skip: page * page_size, take: page_size }); + } + else { + tracks = await this.trackRepository.find(); + } + tracks.forEach(track => { responseTracks.push(new ResponseTrack(track)); }); diff --git a/src/controllers/UserController.ts b/src/controllers/UserController.ts index cdc1fc9..2d1b796 100644 --- a/src/controllers/UserController.ts +++ b/src/controllers/UserController.ts @@ -1,7 +1,7 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; -import { PasswordMustContainLowercaseLetterError, PasswordMustContainNumberError, PasswordMustContainUppercaseLetterError, PasswordTooShortError, UserDeletionNotConfirmedError, UserIdsNotMatchingError, UsernameContainsIllegalCharacterError, UserNotFoundError } from '../errors/UserErrors'; +import { Repository, getConnectionManager } from 'typeorm'; +import { PasswordMustContainLowercaseLetterError, PasswordMustContainNumberError, PasswordMustContainUppercaseLetterError, PasswordTooShortError, UserDeletionNotConfirmedError, UserIdsNotMatchingError, UserNotFoundError, UsernameContainsIllegalCharacterError } from '../errors/UserErrors'; import { UserGroupNotFoundError } from '../errors/UserGroupErrors'; import { CreateUser } from '../models/actions/create/CreateUser'; import { UpdateUser } from '../models/actions/update/UpdateUser'; @@ -28,9 +28,17 @@ export class UserController { @Authorized("USER:GET") @ResponseSchema(ResponseUser, { isArray: true }) @OpenAPI({ description: 'Lists all users.
This includes their groups and permissions granted to them.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseUsers: ResponseUser[] = new Array(); - const users = await this.userRepository.find({ relations: ['permissions', 'groups', 'groups.permissions'] }); + let users: Array; + + if (page) { + users = await this.userRepository.find({ relations: ['permissions', 'groups', 'groups.permissions'], skip: page * page_size, take: page_size }); + } + else { + users = await this.userRepository.find({ relations: ['permissions', 'groups', 'groups.permissions'] }); + } + users.forEach(user => { responseUsers.push(new ResponseUser(user)); }); diff --git a/src/controllers/UserGroupController.ts b/src/controllers/UserGroupController.ts index 71d0b3a..be948ac 100644 --- a/src/controllers/UserGroupController.ts +++ b/src/controllers/UserGroupController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { Repository, getConnectionManager } from 'typeorm'; import { UserGroupIdsNotMatchingError, UserGroupNotFoundError } from '../errors/UserGroupErrors'; import { CreateUserGroup } from '../models/actions/create/CreateUserGroup'; import { UpdateUserGroup } from '../models/actions/update/UpdateUserGroup'; @@ -27,9 +27,16 @@ export class UserGroupController { @Authorized("USERGROUP:GET") @ResponseSchema(ResponseUserGroup, { isArray: true }) @OpenAPI({ description: 'Lists all groups.
The information provided might change while the project continues to evolve.' }) - async getAll() { + async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseGroups: ResponseUserGroup[] = new Array(); - const groups = await this.userGroupsRepository.find({ relations: ['permissions'] }); + let groups: Array; + + if (page) { + groups = await this.userGroupsRepository.find({ relations: ['permissions'], skip: page * page_size, take: page_size }); + } else { + groups = await this.userGroupsRepository.find({ relations: ['permissions'] }); + } + groups.forEach(group => { responseGroups.push(group.toResponse()); }); diff --git a/src/tests/scans/scans_get.spec.ts b/src/tests/scans/scans_get.spec.ts index 384db7c..ec32701 100644 --- a/src/tests/scans/scans_get.spec.ts +++ b/src/tests/scans/scans_get.spec.ts @@ -66,6 +66,8 @@ describe('adding + getting scans', () => { const res = await axios.get(base + '/api/scans/' + added_scan.id, axios_config); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); + delete res.data.runner.distance; + delete added_scan.runner.distance; expect(res.data).toEqual(added_scan); }); it('check if scans was added via the runner/scans endpoint.', async () => {