Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: academic calendar controllers and routes #81

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
45 changes: 45 additions & 0 deletions app/controllers/academic_calendars_controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { HttpContext } from "@adonisjs/core/http";

import AcademicCalendar from "#models/academic_calendar";
import { paginationValidator } from "#validators/pagination";
import { showValidator } from "#validators/show";

export default class AcademicCalendarsController {
protected readonly relations = ["holidays", "daySwaps"];

/**
* Display a list of resource
*/
async index({ request }: HttpContext) {
const { page, limit } = await request.validateUsing(paginationValidator);
const baseQuery = AcademicCalendar.query().withScopes((scopes) => {
scopes.handleSearchQuery(request.qs());
scopes.preloadRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
let academicCalendars;
if (page !== undefined) {
academicCalendars = await baseQuery.paginate(page, limit ?? 10);
} else {
academicCalendars = { data: await baseQuery };
}
return academicCalendars;
}

/**
* Show individual record
*/
async show({ request }: HttpContext) {
const {
params: { id },
} = await request.validateUsing(showValidator);
const academicCalendar = await AcademicCalendar.query()
.withScopes((scopes) => {
scopes.preloadRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();

return { data: academicCalendar };
}
}
14 changes: 12 additions & 2 deletions app/controllers/buildings_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,24 @@ import { paginationValidator } from "#validators/pagination";
import { showValidator } from "#validators/show";

export default class BuildingsController {
protected readonly relations = [
"campus",
"aeds",
"bicycleShowers",
"foodSpots",
"libraries",
"libraries.regularHours",
"libraries.specialHours",
];

/**
* Display a list of resource
*/
async index({ request }: HttpContext) {
const { page, limit } = await request.validateUsing(paginationValidator);
const baseQuery = Building.query().withScopes((scopes) => {
scopes.handleSearchQuery(request.qs(), "iconType");
scopes.preloadRelations(request.only(["campus"]));
scopes.preloadRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
let buildings;
Expand All @@ -33,7 +43,7 @@ export default class BuildingsController {
} = await request.validateUsing(showValidator);
const building = await Building.query()
.withScopes((scopes) => {
scopes.preloadRelations(request.only(["campus"]));
scopes.preloadRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();
Expand Down
12 changes: 10 additions & 2 deletions app/controllers/campuses_controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ import Campus from "#models/campus";
import { showValidator } from "#validators/show";

export default class CampusesController {
protected readonly relations = [
"buildings",
"buildings.aeds",
"buildings.bicycleShowers",
"buildings.foodSpots",
"buildings.libraries",
];
Comment on lines +7 to +13
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could also add buildings.libraries.{regular,special}Hours


/**
* Display a list of resource
*/
Expand All @@ -12,7 +20,7 @@ export default class CampusesController {
scopes.handleSearchQuery(
request.only(["id", "name", "createdAt", "updatedAt"]),
);
scopes.includeRelations(request.only(["buildings"]));
scopes.includeRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
return { data: campuses };
Expand All @@ -27,7 +35,7 @@ export default class CampusesController {
} = await request.validateUsing(showValidator);
const campus = await Campus.query()
.withScopes((scopes) => {
scopes.includeRelations(request.only(["buildings"]));
scopes.includeRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();
Expand Down
45 changes: 45 additions & 0 deletions app/controllers/day_swaps_controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { HttpContext } from "@adonisjs/core/http";

import DaySwap from "#models/day_swap";
import { paginationValidator } from "#validators/pagination";
import { showValidator } from "#validators/show";

export default class DaySwapsController {
protected readonly relations = ["academicCalendar"];

/**
* Display a list of resource
*/
async index({ request }: HttpContext) {
const { page, limit } = await request.validateUsing(paginationValidator);
const baseQuery = DaySwap.query().withScopes((scopes) => {
scopes.handleSearchQuery(request.qs(), "changedWeekday");
scopes.preloadRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
let daySwaps;
if (page !== undefined) {
daySwaps = await baseQuery.paginate(page, limit ?? 10);
} else {
daySwaps = { data: await baseQuery };
}
return daySwaps;
}

/**
* Show individual record
*/
async show({ request }: HttpContext) {
const {
params: { id },
} = await request.validateUsing(showValidator);
const academicCalendar = await DaySwap.query()
.withScopes((scopes) => {
scopes.preloadRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();

return { data: academicCalendar };
}
}
45 changes: 45 additions & 0 deletions app/controllers/holidays_controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { HttpContext } from "@adonisjs/core/http";

import Holiday from "#models/holiday";
import { paginationValidator } from "#validators/pagination";
import { showValidator } from "#validators/show";

export default class HolidaysController {
protected readonly relations = ["academicCalendar"];

/**
* Display a list of resource
*/
async index({ request }: HttpContext) {
const { page, limit } = await request.validateUsing(paginationValidator);
const baseQuery = Holiday.query().withScopes((scopes) => {
scopes.handleSearchQuery(request.qs());
scopes.preloadRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
let holidays;
if (page !== undefined) {
holidays = await baseQuery.paginate(page, limit ?? 10);
} else {
holidays = { data: await baseQuery };
}
return holidays;
}

/**
* Show individual record
*/
async show({ request }: HttpContext) {
const {
params: { id },
} = await request.validateUsing(showValidator);
const academicCalendar = await Holiday.query()
.withScopes((scopes) => {
scopes.preloadRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();

return { data: academicCalendar };
}
}
45 changes: 45 additions & 0 deletions app/controllers/libraries_controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { HttpContext } from "@adonisjs/core/http";

import Library from "#models/library";
import { paginationValidator } from "#validators/pagination";
import { showValidator } from "#validators/show";

export default class LibrariesController {
protected readonly relations = ["regularHours", "specialHours", "building"];

/**
* Display a list of resource
*/
async index({ request }: HttpContext) {
const { page, limit } = await request.validateUsing(paginationValidator);
const baseQuery = Library.query().withScopes((scopes) => {
scopes.handleSearchQuery(request.qs());
scopes.preloadRelations(request.only(this.relations));
scopes.handleSortQuery(request.input("sort"));
});
let libraries;
if (page !== undefined) {
libraries = await baseQuery.paginate(page, limit ?? 10);
} else {
libraries = { data: await baseQuery };
}
return libraries;
}

/**
* Show individual record
*/
async show({ request }: HttpContext) {
const {
params: { id },
} = await request.validateUsing(showValidator);
const library = await Library.query()
.withScopes((scopes) => {
scopes.preloadRelations(request.only(this.relations));
})
.where("id", id)
.firstOrFail();

return { data: library };
}
}
25 changes: 22 additions & 3 deletions app/models/academic_calendar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,38 @@ import { DateTime } from "luxon";
import { BaseModel, column, hasMany } from "@adonisjs/lucid/orm";
import type { HasMany } from "@adonisjs/lucid/types/relations";

import { typedModel } from "#decorators/typed_model";
import { preloadRelations } from "#scopes/preload_helper";
import { handleSearchQuery } from "#scopes/search_helper";
import { handleSortQuery } from "#scopes/sort_helper";

import DaySwap from "./day_swap.js";
import Holiday from "./holiday.js";

@typedModel({
id: "number",
name: "string",
semesterStartDate: "DateTime",
examSessionStartDate: "DateTime",
examSessionLastDate: "DateTime",
isFirstWeekEven: "boolean",
createdAt: "DateTime",
updatedAt: "DateTime",
})
export default class AcademicCalendar extends BaseModel {
@column({ isPrimary: true })
declare id: number;

@column()
declare name: string;

@column.date({ prepare: (v: Date) => v.toISOString() })
@column.date()
declare semesterStartDate: DateTime;

@column.date({ prepare: (v: Date) => v.toISOString() })
@column.date()
declare examSessionStartDate: DateTime;

@column.date({ prepare: (v: Date) => v.toISOString() })
@column.date()
declare examSessionLastDate: DateTime;

@column()
Expand All @@ -36,4 +51,8 @@ export default class AcademicCalendar extends BaseModel {

@hasMany(() => Holiday)
declare holidays: HasMany<typeof Holiday>;

static preloadRelations = preloadRelations(AcademicCalendar);
static handleSearchQuery = handleSearchQuery(AcademicCalendar);
static handleSortQuery = handleSortQuery(AcademicCalendar);
}
4 changes: 2 additions & 2 deletions app/models/aed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ export default class Aed extends BaseModel {
@column()
declare longitude: number;

@column()
@column({ columnName: "address_line1" })
declare addressLine1: string | null;

@column()
@column({ columnName: "address_line2" })
declare addressLine2: string | null;

@column()
Expand Down
4 changes: 2 additions & 2 deletions app/models/bicycle_shower.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ export default class BicycleShower extends BaseModel {
@column()
declare longitude: number;

@column()
@column({ columnName: "address_line1" })
declare addressLine1: string | null;

@column()
@column({ columnName: "address_line2" })
declare addressLine2: string | null;

@column()
Expand Down
21 changes: 19 additions & 2 deletions app/models/day_swap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,32 @@ import { DateTime } from "luxon";
import { BaseModel, belongsTo, column } from "@adonisjs/lucid/orm";
import type { BelongsTo } from "@adonisjs/lucid/types/relations";

import { typedModel } from "#decorators/typed_model";
import { Weekday } from "#enums/weekday";
import { preloadRelations } from "#scopes/preload_helper";
import { handleSearchQuery } from "#scopes/search_helper";
import { handleSortQuery } from "#scopes/sort_helper";

import AcademicCalendar from "./academic_calendar.js";

@typedModel({
id: "number",
academicCalendarId: "number",
date: "DateTime",
changedWeekday: "string",
changedDayIsEven: "boolean",
createdAt: "DateTime",
updatedAt: "DateTime",
})
export default class DaySwap extends BaseModel {
@column({ isPrimary: true })
declare id: number;

@column()
declare academicCalendarId: number;

@column()
declare date: Date;
@column.date()
declare date: DateTime;

@column()
declare changedWeekday: Weekday;
Expand All @@ -31,4 +44,8 @@ export default class DaySwap extends BaseModel {

@belongsTo(() => AcademicCalendar)
declare academicCalendar: BelongsTo<typeof AcademicCalendar>;

static preloadRelations = preloadRelations(DaySwap);
static handleSearchQuery = handleSearchQuery(DaySwap);
static handleSortQuery = handleSortQuery(DaySwap);
}
4 changes: 2 additions & 2 deletions app/models/food_spot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ export default class FoodSpot extends BaseModel {
@column()
declare name: string;

@column()
@column({ columnName: "address_line1" })
declare addressLine1: string | null;

@column()
@column({ columnName: "address_line2" })
declare addressLine2: string | null;

@column()
Expand Down
Loading
Loading