From 69a23e04c5a0cc1acc54edf8cde64f413c1431e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 14:04:35 +0100 Subject: [PATCH 01/12] feat: update academic_calendar, holiday and day_swap model --- app/models/academic_calendar.ts | 25 ++++++++++++++++++++++--- app/models/day_swap.ts | 21 +++++++++++++++++++-- app/models/holiday.ts | 18 ++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/app/models/academic_calendar.ts b/app/models/academic_calendar.ts index 4343fb8..0a06dae 100644 --- a/app/models/academic_calendar.ts +++ b/app/models/academic_calendar.ts @@ -3,9 +3,24 @@ 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; @@ -13,13 +28,13 @@ export default class AcademicCalendar extends BaseModel { @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() @@ -36,4 +51,8 @@ export default class AcademicCalendar extends BaseModel { @hasMany(() => Holiday) declare holidays: HasMany; + + static preloadRelations = preloadRelations(AcademicCalendar); + static handleSearchQuery = handleSearchQuery(AcademicCalendar); + static handleSortQuery = handleSortQuery(AcademicCalendar); } diff --git a/app/models/day_swap.ts b/app/models/day_swap.ts index 14de6e0..e235eeb 100644 --- a/app/models/day_swap.ts +++ b/app/models/day_swap.ts @@ -3,10 +3,23 @@ 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; @@ -14,8 +27,8 @@ export default class DaySwap extends BaseModel { @column() declare academicCalendarId: number; - @column() - declare date: Date; + @column.date() + declare date: DateTime; @column() declare changedWeekday: Weekday; @@ -31,4 +44,8 @@ export default class DaySwap extends BaseModel { @belongsTo(() => AcademicCalendar) declare academicCalendar: BelongsTo; + + static preloadRelations = preloadRelations(DaySwap); + static handleSearchQuery = handleSearchQuery(DaySwap); + static handleSortQuery = handleSortQuery(DaySwap); } diff --git a/app/models/holiday.ts b/app/models/holiday.ts index 3d0b14f..58a432c 100644 --- a/app/models/holiday.ts +++ b/app/models/holiday.ts @@ -3,8 +3,22 @@ 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 { 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", + startDate: "DateTime", + lastDate: "DateTime", + description: "string", + createdAt: "DateTime", + updatedAt: "DateTime", +}) export default class Holiday extends BaseModel { @column({ isPrimary: true }) declare id: number; @@ -29,4 +43,8 @@ export default class Holiday extends BaseModel { @belongsTo(() => AcademicCalendar) declare academicCalendar: BelongsTo; + + static preloadRelations = preloadRelations(Holiday); + static handleSearchQuery = handleSearchQuery(Holiday); + static handleSortQuery = handleSortQuery(Holiday); } From b08d78a504b8606855841ddc463a360a87dadd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 14:06:13 +0100 Subject: [PATCH 02/12] feat: add controllers for academic_calendar, holiday and day_swap --- .../academic_calendars_controller.ts | 45 +++++++++++++++++++ app/controllers/day_swaps_controller.ts | 45 +++++++++++++++++++ app/controllers/holidays_controller.ts | 45 +++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 app/controllers/academic_calendars_controller.ts create mode 100644 app/controllers/day_swaps_controller.ts create mode 100644 app/controllers/holidays_controller.ts diff --git a/app/controllers/academic_calendars_controller.ts b/app/controllers/academic_calendars_controller.ts new file mode 100644 index 0000000..0cb3842 --- /dev/null +++ b/app/controllers/academic_calendars_controller.ts @@ -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 }; + } +} diff --git a/app/controllers/day_swaps_controller.ts b/app/controllers/day_swaps_controller.ts new file mode 100644 index 0000000..de5c092 --- /dev/null +++ b/app/controllers/day_swaps_controller.ts @@ -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()); + 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 }; + } +} diff --git a/app/controllers/holidays_controller.ts b/app/controllers/holidays_controller.ts new file mode 100644 index 0000000..a669f3f --- /dev/null +++ b/app/controllers/holidays_controller.ts @@ -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 }; + } +} From 8ef330ef2f13c9634db8e3cc12d142f73a15906b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 14:07:03 +0100 Subject: [PATCH 03/12] feat: add routes for academic_calendar, holiday and day_swap --- start/routes.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index 81aee16..830f8bb 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -27,6 +27,10 @@ const GuideAuthorsController = () => import("#controllers/guide_authors_controller"); const GuideQuestionsController = () => import("#controllers/guide_questions_controller"); +const AcademicCalendarsController = () => + import("#controllers/academic_calendars_controller"); +const HolidaysController = () => import("#controllers/holidays_controller"); +const DaySwapsController = () => import("#controllers/day_swaps_controller"); router.get("/", async () => { return { appName: env.get("APP_NAME"), version: env.get("APP_VERSION") }; @@ -115,3 +119,24 @@ router router.get("/", [GuideQuestionsController, "index"]); }) .prefix("api/v1/guide_questions"); + +router + .group(() => { + router.get("/:id", [AcademicCalendarsController, "show"]); + router.get("/", [AcademicCalendarsController, "index"]); + }) + .prefix("api/v1/academic-calendars"); + +router + .group(() => { + router.get("/:id", [HolidaysController, "show"]); + router.get("/", [HolidaysController, "index"]); + }) + .prefix("api/v1/holidays"); + +router + .group(() => { + router.get("/:id", [DaySwapsController, "show"]); + router.get("/", [DaySwapsController, "index"]); + }) + .prefix("api/v1/day-swaps"); From 55801c4a9f3250a0796f6826b3fe77d86797b83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 14:10:15 +0100 Subject: [PATCH 04/12] feat: add db seeder for academic_calendar, holiday and day_swap --- ...alendar_and_holiday_and_day_swap_seeder.ts | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts diff --git a/database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts b/database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts new file mode 100644 index 0000000..ac0d72c --- /dev/null +++ b/database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts @@ -0,0 +1,184 @@ +import { DateTime } from "luxon"; + +import { BaseSeeder } from "@adonisjs/lucid/seeders"; + +import { Weekday } from "#enums/weekday"; +import AcademicCalendar from "#models/academic_calendar"; + +export default class extends BaseSeeder { + static environment = ["development", "testing"]; + + async run() { + const calendars = await AcademicCalendar.createMany([ + { + name: "Cal1", + semesterStartDate: DateTime.local(2023, 10, 1), + examSessionStartDate: DateTime.local(2024, 2, 1), + examSessionLastDate: DateTime.local(2024, 2, 14), + isFirstWeekEven: true, + }, + { + name: "Cal2", + semesterStartDate: DateTime.local(2024, 2, 26), + examSessionStartDate: DateTime.local(2024, 6, 18), + examSessionLastDate: DateTime.local(2024, 7, 5), + isFirstWeekEven: false, + }, + { + name: "Cal3", + semesterStartDate: DateTime.local(2021, 10, 3), + examSessionStartDate: DateTime.local(2022, 2, 3), + examSessionLastDate: DateTime.local(2022, 2, 17), + isFirstWeekEven: false, + }, + { + name: "Cal4", + semesterStartDate: DateTime.local(2022, 3, 2), + examSessionStartDate: DateTime.local(2022, 6, 26), + examSessionLastDate: DateTime.local(2022, 7, 14), + isFirstWeekEven: true, + }, + ]); + + const dates = [ + [ + { + start: DateTime.local(2023, 11, 11), + last: DateTime.local(2023, 11, 11), + }, + { + start: DateTime.local(2023, 11, 15), + last: DateTime.local(2023, 11, 15), + }, + { + start: DateTime.local(2023, 12, 20), + last: DateTime.local(2024, 1, 8), + }, + ], + [ + { + start: DateTime.local(2024, 4, 11), + last: DateTime.local(2024, 4, 16), + }, + { + start: DateTime.local(2024, 4, 30), + last: DateTime.local(2024, 5, 6), + }, + { + start: DateTime.local(2024, 6, 14), + last: DateTime.local(2024, 6, 17), + }, + ], + [ + { + start: DateTime.local(2021, 11, 11), + last: DateTime.local(2021, 11, 11), + }, + { + start: DateTime.local(2021, 11, 15), + last: DateTime.local(2021, 11, 15), + }, + { + start: DateTime.local(2021, 12, 18), + last: DateTime.local(2022, 1, 6), + }, + ], + [ + { + start: DateTime.local(2022, 3, 30), + last: DateTime.local(2022, 4, 6), + }, + { + start: DateTime.local(2022, 4, 29), + last: DateTime.local(2022, 5, 5), + }, + { + start: DateTime.local(2022, 6, 7), + last: DateTime.local(2022, 6, 11), + }, + ], + ]; + + const dateWithChangedWeekday = [ + [ + { date: DateTime.local(2023, 11, 19), changedWeekday: Weekday.Friday }, + { + date: DateTime.local(2023, 12, 18), + changedWeekday: Weekday.Thursday, + }, + { date: DateTime.local(2024, 1, 21), changedWeekday: Weekday.Monday }, + { date: DateTime.local(2024, 1, 29), changedWeekday: Weekday.Friday }, + ], + [ + { date: DateTime.local(2024, 3, 22), changedWeekday: Weekday.Thursday }, + { date: DateTime.local(2024, 4, 12), changedWeekday: Weekday.Tuesday }, + { date: DateTime.local(2024, 5, 18), changedWeekday: Weekday.Thursday }, + { date: DateTime.local(2024, 6, 6), changedWeekday: Weekday.Monday }, + ], + [ + { date: DateTime.local(2021, 11, 21), changedWeekday: Weekday.Friday }, + { date: DateTime.local(2022, 1, 11), changedWeekday: Weekday.Tuesday }, + { + date: DateTime.local(2022, 1, 17), + changedWeekday: Weekday.Wednesday, + }, + { date: DateTime.local(2022, 1, 22), changedWeekday: Weekday.Tuesday }, + ], + [ + { date: DateTime.local(2022, 4, 3), changedWeekday: Weekday.Monday }, + { + date: DateTime.local(2022, 4, 28), + changedWeekday: Weekday.Wednesday, + }, + { date: DateTime.local(2022, 5, 23), changedWeekday: Weekday.Friday }, + { + date: DateTime.local(2022, 6, 13), + changedWeekday: Weekday.Wednesday, + }, + ], + ]; + + for (const [i, calendar] of calendars.entries()) { + await calendar.related("holidays").createMany([ + { + startDate: dates[i][0].start, + lastDate: dates[i][0].last, + description: `Description for holiday 1 in calendar ${i + 1}`, + }, + { + startDate: dates[i][1].start, + lastDate: dates[i][1].last, + description: `Description for holiday 2 in calendar ${i + 1}`, + }, + { + startDate: dates[i][2].start, + lastDate: dates[i][2].last, + description: `Description for holiday 3 in calendar ${i + 1}`, + }, + ]); + + await calendar.related("daySwaps").createMany([ + { + date: dateWithChangedWeekday[i][0].date, + changedWeekday: dateWithChangedWeekday[i][0].changedWeekday, + changedDayIsEven: true, + }, + { + date: dateWithChangedWeekday[i][1].date, + changedWeekday: dateWithChangedWeekday[i][1].changedWeekday, + changedDayIsEven: false, + }, + { + date: dateWithChangedWeekday[i][2].date, + changedWeekday: dateWithChangedWeekday[i][2].changedWeekday, + changedDayIsEven: false, + }, + { + date: dateWithChangedWeekday[i][3].date, + changedWeekday: dateWithChangedWeekday[i][3].changedWeekday, + changedDayIsEven: true, + }, + ]); + } + } +} From 2213c2f77df94339236d419e05416b2c2711b1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 18:50:16 +0100 Subject: [PATCH 05/12] refactor: rename academic_calendar seeder name --- ...holiday_and_day_swap_seeder.ts => academic_calendar_seeder.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename database/seeders/{academic_calendar_and_holiday_and_day_swap_seeder.ts => academic_calendar_seeder.ts} (100%) diff --git a/database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts b/database/seeders/academic_calendar_seeder.ts similarity index 100% rename from database/seeders/academic_calendar_and_holiday_and_day_swap_seeder.ts rename to database/seeders/academic_calendar_seeder.ts From 47e22eb60d83a0b1dbc5993244edfd1040d07049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Sun, 19 Jan 2025 22:39:53 +0100 Subject: [PATCH 06/12] refactor: convert route URLs to snake_case --- start/routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 830f8bb..7ae2bc5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -125,7 +125,7 @@ router router.get("/:id", [AcademicCalendarsController, "show"]); router.get("/", [AcademicCalendarsController, "index"]); }) - .prefix("api/v1/academic-calendars"); + .prefix("api/v1/academic_calendars"); router .group(() => { @@ -139,4 +139,4 @@ router router.get("/:id", [DaySwapsController, "show"]); router.get("/", [DaySwapsController, "index"]); }) - .prefix("api/v1/day-swaps"); + .prefix("api/v1/day_swaps"); From a3bc51402967c4e0780322a32f1ed8e8f60a8cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 20:54:40 +0100 Subject: [PATCH 07/12] fix: fix migrations types --- .../1732381079405_create_buildings_table.ts | 2 +- .../1732382114870_create_food_spots_table.ts | 2 +- .../1732382272260_create_aeds_table.ts | 2 +- .../1732382357899_create_libraries_table.ts | 2 +- ...732382717523_create_regular_hours_table.ts | 20 +++++++++++++++++-- ...732382722865_create_special_hours_table.ts | 2 +- ...2382895806_create_bicycle_showers_table.ts | 2 +- .../1732879255634_create_day_swaps_table.ts | 2 +- .../1732880134346_create_holidays_table.ts | 2 +- 9 files changed, 26 insertions(+), 10 deletions(-) diff --git a/database/migrations/1732381079405_create_buildings_table.ts b/database/migrations/1732381079405_create_buildings_table.ts index 48bc8f5..4c404ad 100644 --- a/database/migrations/1732381079405_create_buildings_table.ts +++ b/database/migrations/1732381079405_create_buildings_table.ts @@ -17,7 +17,7 @@ export default class extends BaseSchema { }) .notNullable(); - table.bigInteger("campus_id").unsigned().notNullable(); + table.integer("campus_id").unsigned().notNullable(); table .foreign("campus_id") .references("id") diff --git a/database/migrations/1732382114870_create_food_spots_table.ts b/database/migrations/1732382114870_create_food_spots_table.ts index d54ef02..191aec8 100644 --- a/database/migrations/1732382114870_create_food_spots_table.ts +++ b/database/migrations/1732382114870_create_food_spots_table.ts @@ -13,7 +13,7 @@ export default class extends BaseSchema { table.decimal("longitude").notNullable(); table.text("photo_url").nullable(); - table.bigInteger("building_id").unsigned().nullable(); + table.integer("building_id").unsigned().nullable(); table .foreign("building_id") .references("buildings.id") diff --git a/database/migrations/1732382272260_create_aeds_table.ts b/database/migrations/1732382272260_create_aeds_table.ts index 8cddaf8..0c67821 100644 --- a/database/migrations/1732382272260_create_aeds_table.ts +++ b/database/migrations/1732382272260_create_aeds_table.ts @@ -12,7 +12,7 @@ export default class extends BaseSchema { table.text("address_line2").nullable(); table.text("photo_url").nullable(); - table.bigInteger("building_id").unsigned().nullable(); + table.integer("building_id").unsigned().nullable(); table .foreign("building_id") .references("buildings.id") diff --git a/database/migrations/1732382357899_create_libraries_table.ts b/database/migrations/1732382357899_create_libraries_table.ts index d12a706..47bb95d 100644 --- a/database/migrations/1732382357899_create_libraries_table.ts +++ b/database/migrations/1732382357899_create_libraries_table.ts @@ -17,7 +17,7 @@ export default class extends BaseSchema { table.decimal("longitude").notNullable(); table.text("photo_url").nullable(); - table.bigInteger("building_id").unsigned().nullable(); + table.integer("building_id").unsigned().nullable(); table .foreign("building_id") .references("buildings.id") diff --git a/database/migrations/1732382717523_create_regular_hours_table.ts b/database/migrations/1732382717523_create_regular_hours_table.ts index 11e2fe9..60ecc69 100644 --- a/database/migrations/1732382717523_create_regular_hours_table.ts +++ b/database/migrations/1732382717523_create_regular_hours_table.ts @@ -2,16 +2,31 @@ import { BaseSchema } from "@adonisjs/lucid/schema"; export default class extends BaseSchema { protected tableName = "regular_hours"; + protected weekdays = [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", + ]; async up() { this.schema.createTable(this.tableName, (table) => { table.increments("id"); - table.integer("week_day").checkBetween([1, 7]).notNullable(); + table + .enum("week_day", this.weekdays, { + useNative: true, + enumName: "week_day", + existingType: false, + }) + .notNullable(); table.time("open_time").notNullable(); table.time("close_time").notNullable(); - table.bigInteger("library_id").unsigned().notNullable(); + table.integer("library_id").unsigned().notNullable(); table .foreign("library_id") .references("libraries.id") @@ -24,5 +39,6 @@ export default class extends BaseSchema { async down() { this.schema.dropTable(this.tableName); + this.schema.raw('DROP TYPE IF EXISTS "week_day"'); } } diff --git a/database/migrations/1732382722865_create_special_hours_table.ts b/database/migrations/1732382722865_create_special_hours_table.ts index 5910c79..998752d 100644 --- a/database/migrations/1732382722865_create_special_hours_table.ts +++ b/database/migrations/1732382722865_create_special_hours_table.ts @@ -11,7 +11,7 @@ export default class extends BaseSchema { table.time("open_time").notNullable(); table.time("close_time").notNullable(); - table.bigInteger("library_id").unsigned().notNullable(); + table.integer("library_id").unsigned().notNullable(); table .foreign("library_id") .references("libraries.id") diff --git a/database/migrations/1732382895806_create_bicycle_showers_table.ts b/database/migrations/1732382895806_create_bicycle_showers_table.ts index 5bb4d9a..a9fb557 100644 --- a/database/migrations/1732382895806_create_bicycle_showers_table.ts +++ b/database/migrations/1732382895806_create_bicycle_showers_table.ts @@ -15,7 +15,7 @@ export default class extends BaseSchema { table.text("address_line2").nullable(); table.text("photo_url").nullable(); - table.bigInteger("building_id").unsigned().nullable(); + table.integer("building_id").unsigned().nullable(); table .foreign("building_id") .references("buildings.id") diff --git a/database/migrations/1732879255634_create_day_swaps_table.ts b/database/migrations/1732879255634_create_day_swaps_table.ts index 91c9083..1fa9542 100644 --- a/database/migrations/1732879255634_create_day_swaps_table.ts +++ b/database/migrations/1732879255634_create_day_swaps_table.ts @@ -16,7 +16,7 @@ export default class extends BaseSchema { this.schema.createTable(this.tableName, (table) => { table.increments("id"); - table.bigInteger("academic_calendar_id").unsigned().notNullable(); + table.integer("academic_calendar_id").unsigned().notNullable(); table .foreign("academic_calendar_id") .references("academic_calendars.id") diff --git a/database/migrations/1732880134346_create_holidays_table.ts b/database/migrations/1732880134346_create_holidays_table.ts index 36eda23..edc7379 100644 --- a/database/migrations/1732880134346_create_holidays_table.ts +++ b/database/migrations/1732880134346_create_holidays_table.ts @@ -7,7 +7,7 @@ export default class extends BaseSchema { this.schema.createTable(this.tableName, (table) => { table.increments("id"); - table.bigInteger("academic_calendar_id").unsigned().notNullable(); + table.integer("academic_calendar_id").unsigned().notNullable(); table .foreign("academic_calendar_id") .references("academic_calendars.id") From 7947aeaaaca316978c807866bbb8f7bbdf0bf85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 20:56:05 +0100 Subject: [PATCH 08/12] fix: fix models types and column_names --- app/models/aed.ts | 4 ++-- app/models/bicycle_shower.ts | 4 ++-- app/models/food_spot.ts | 4 ++-- app/models/library.ts | 11 +++++++++-- app/models/regular_hour.ts | 3 ++- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/models/aed.ts b/app/models/aed.ts index 6d4178f..4019307 100644 --- a/app/models/aed.ts +++ b/app/models/aed.ts @@ -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() diff --git a/app/models/bicycle_shower.ts b/app/models/bicycle_shower.ts index a2eb780..615c39c 100644 --- a/app/models/bicycle_shower.ts +++ b/app/models/bicycle_shower.ts @@ -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() diff --git a/app/models/food_spot.ts b/app/models/food_spot.ts index 00c4c12..0801542 100644 --- a/app/models/food_spot.ts +++ b/app/models/food_spot.ts @@ -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() diff --git a/app/models/library.ts b/app/models/library.ts index 4ad0e4b..b026592 100644 --- a/app/models/library.ts +++ b/app/models/library.ts @@ -6,6 +6,9 @@ import type { BelongsTo, HasMany } from "@adonisjs/lucid/types/relations"; import Building from "./building.js"; import RegularHour from "./regular_hour.js"; import SpecialHour from "./special_hour.js"; +import { preloadRelations } from "#scopes/preload_helper"; +import { handleSearchQuery } from "#scopes/search_helper"; +import { handleSortQuery } from "#scopes/sort_helper"; export default class Library extends BaseModel { @column({ isPrimary: true }) @@ -17,10 +20,10 @@ export default class Library extends BaseModel { @column() declare room: string | null; - @column() + @column({ columnName: "address_line1" }) declare addressLine1: string | null; - @column() + @column({ columnName: "address_line2" }) declare addressLine2: string | null; @column() @@ -55,4 +58,8 @@ export default class Library extends BaseModel { @column.dateTime({ autoCreate: true, autoUpdate: true }) declare updatedAt: DateTime; + + static preloadRelations = preloadRelations(Library); + static handleSearchQuery = handleSearchQuery(Library); + static handleSortQuery = handleSortQuery(Library); } diff --git a/app/models/regular_hour.ts b/app/models/regular_hour.ts index 6537f60..5fa4b32 100644 --- a/app/models/regular_hour.ts +++ b/app/models/regular_hour.ts @@ -4,13 +4,14 @@ import { BaseModel, belongsTo, column } from "@adonisjs/lucid/orm"; import type { BelongsTo } from "@adonisjs/lucid/types/relations"; import Library from "./library.js"; +import { Weekday } from "#enums/weekday"; export default class RegularHour extends BaseModel { @column({ isPrimary: true }) declare id: number; @column() - declare weekDay: number; + declare weekDay: Weekday; @column() declare openTime: string; From 4da95138f8b512a1acfcb47d5d0f7c668d67789f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 20:59:00 +0100 Subject: [PATCH 09/12] feat: update seeder to libraries and other relations --- database/seeders/building_seeder.ts | 183 +++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 5 deletions(-) diff --git a/database/seeders/building_seeder.ts b/database/seeders/building_seeder.ts index 5509637..b76b637 100644 --- a/database/seeders/building_seeder.ts +++ b/database/seeders/building_seeder.ts @@ -4,12 +4,16 @@ import Building from "#models/building"; import Campus from "#models/campus"; import { BuildingIcon } from "../../app/enums/building_icon.js"; +import Library from "#models/library"; +import { Weekday } from "#enums/weekday"; +import { DateTime } from "luxon"; + export default class BuildingSeeder extends BaseSeeder { static environment = ["development", "testing"]; async run() { - await Campus.createMany([ + const capmuses = await Campus.createMany([ { name: "taki", cover: "http://example.com", @@ -23,12 +27,12 @@ export default class BuildingSeeder extends BaseSeeder { cover: "http://example.com", }, ]); - await Building.createMany([ + + const buildings = [ { identifier: "B001", specialName: "Main Admin Building", iconType: BuildingIcon.Icon, - campusId: 2, addressLine1: "123 University Ave", addressLine2: "Building A", latitude: 40.7128, @@ -40,7 +44,6 @@ export default class BuildingSeeder extends BaseSeeder { identifier: "B002", specialName: "Engineering Block", iconType: BuildingIcon.Icon, - campusId: 3, addressLine1: "124 University Ave", addressLine2: "Building B", latitude: 40.7129, @@ -52,7 +55,6 @@ export default class BuildingSeeder extends BaseSeeder { identifier: "B003", specialName: null, iconType: BuildingIcon.Icon, - campusId: 2, addressLine1: "500 Science Park", addressLine2: "kolowe sny", latitude: 37.7749, @@ -60,6 +62,177 @@ export default class BuildingSeeder extends BaseSeeder { haveFood: true, cover: "https://example.com/covers/building3.jpg", }, + ]; + + const updatedBuildings: Building[] = []; + for(const [i, campus] of capmuses.entries()) { + updatedBuildings[i] = await campus.related("buildings").create(buildings[i]); + } + + const libraries = await Library.createMany([ + { + title: "Old library", + room: "123", + addressLine1: "123 University Ave", + addressLine2: "Building A", + phone: "673 872 568", + email: "old.lib@mail.com", + latitude: 40.7128, + longitude: -74.006, + photoUrl: "https://photo1.com", + }, + { + title: "New library", + room: null, + addressLine1: "500 Science Park", + addressLine2: "Tower", + phone: "962 871 902", + email: "new.lib@mail.com", + latitude: 48.1683, + longitude: -217.072, + photoUrl: "https://photo2.com", + }, + { + title: "Sun library", + room: "62", + addressLine1: "113 University Ave", + addressLine2: "Building E", + phone: "872 924 124", + email: "sun.lib@mail.com", + latitude: 37.7749, + longitude: -122.4194, + photoUrl: "https://photo3.com", + }, ]); + + const regularHours = [ + { + weekDay: Weekday.Monday, + openTime: "10:00", + closeTime: "18:00", + }, + { + weekDay: Weekday.Tuesday, + openTime: "10:00", + closeTime: "17:00", + }, + { + weekDay: Weekday.Wednesday, + openTime: "10:00", + closeTime: "17:00", + }, + { + weekDay: Weekday.Thursday, + openTime: "10:00", + closeTime: "17:00", + }, + { + weekDay: Weekday.Friday, + openTime: "09:00", + closeTime: "16:00", + }, + ]; + + const specialHours = [ + { + specialDate: DateTime.local(2023, 11, 15), + openTime: "10:00", + closeTime: "14:00", + }, + { + specialDate: DateTime.local(2023, 12, 19), + openTime: "08:00", + closeTime: "15:00", + }, + { + specialDate: DateTime.local(2024, 4, 5), + openTime: "09:30", + closeTime: "13:00", + }, + { + specialDate: DateTime.local(2024, 4, 30), + openTime: "10:00", + closeTime: "15:30", + }, + ]; + + for(const [i, library] of libraries.entries()) { + await library.related("regularHours").createMany([ + regularHours[0], regularHours[1], regularHours[2], regularHours[3], regularHours[4] + ]); + + await library.related("specialHours").createMany([ + specialHours[0], specialHours[1], specialHours[2] + ]); + if (i === 0) { + await library.related("specialHours").create(specialHours[3]); + } + } + + + const aeds = [ + { + latitude: 40.7812, + longitude: -74.826, + addressLine1: "123 University Ave", + addressLine2: "Building A", + photoUrl: "https://ex_photo.jpg", + }, + { + latitude: 40.7824, + longitude: -74.2841, + addressLine1: "124 University Ave", + addressLine2: "Building B", + photoUrl: "https://fejiax_photo.jpg", + }, + { + latitude: 37.7292, + longitude: -122.2924, + addressLine1: "500 Science Park", + addressLine2: "Tower", + photoUrl: "https://skjkfj_photo.jpg", + }, + ]; + + const bicycleShowers = [ + { + room: "718", + instructions: "Jhjhfansdmuicndjnvkncnadjvckj", + latitude: 40.7812, + longitude: -74.826, + addressLine1: "123 University Ave", + addressLine2: "Building A", + photoUrl: "https://yhads782jf_photo.jpg", + }, + { + room: "219", + instructions: "klojuhfasnfeukncjadskca", + latitude: 40.7824, + longitude: -74.2841, + addressLine1: "124 University Ave", + addressLine2: "Building B", + photoUrl: "https://agjhsf_photo.jpg", + }, + ]; + + const foodSpot = { + name: "Food spot 1", + latitude: 40.7812, + longitude: -74.826, + addressLine1: "123 University Ave", + addressLine2: "Building A", + photoUrl: "https://food_spot_photo1.jpg", + }; + + for(const [i, building] of updatedBuildings.entries()) { + await building.related("aeds").create(aeds[i]); + if (i == 0 || i == 1) { + await building.related("bicycleShowers").create(bicycleShowers[i]); + } + if (i == 0) { + await building.related("foodSpots").create(foodSpot); + } + await libraries[i].merge({ buildingId: building.id }).save(); + } } } From baae2bc23dfeef51d2aa789170575dd748820969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 21:00:42 +0100 Subject: [PATCH 10/12] feat: add library controllers and update others --- app/controllers/buildings_controller.ts | 6 ++-- app/controllers/campuses_controller.ts | 6 ++-- app/controllers/day_swaps_controller.ts | 2 +- app/controllers/libraries_controller.ts | 44 +++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 app/controllers/libraries_controller.ts diff --git a/app/controllers/buildings_controller.ts b/app/controllers/buildings_controller.ts index 4877169..76878f2 100644 --- a/app/controllers/buildings_controller.ts +++ b/app/controllers/buildings_controller.ts @@ -5,6 +5,8 @@ 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 */ @@ -12,7 +14,7 @@ export default class BuildingsController { 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; @@ -33,7 +35,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(); diff --git a/app/controllers/campuses_controller.ts b/app/controllers/campuses_controller.ts index 87666fb..6dbf742 100644 --- a/app/controllers/campuses_controller.ts +++ b/app/controllers/campuses_controller.ts @@ -4,6 +4,8 @@ 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"]; + /** * Display a list of resource */ @@ -12,7 +14,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 }; @@ -27,7 +29,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(); diff --git a/app/controllers/day_swaps_controller.ts b/app/controllers/day_swaps_controller.ts index de5c092..9ff2d1f 100644 --- a/app/controllers/day_swaps_controller.ts +++ b/app/controllers/day_swaps_controller.ts @@ -13,7 +13,7 @@ export default class DaySwapsController { async index({ request }: HttpContext) { const { page, limit } = await request.validateUsing(paginationValidator); const baseQuery = DaySwap.query().withScopes((scopes) => { - scopes.handleSearchQuery(request.qs()); + scopes.handleSearchQuery(request.qs(), "changedWeekday"); scopes.preloadRelations(request.only(this.relations)); scopes.handleSortQuery(request.input("sort")); }); diff --git a/app/controllers/libraries_controller.ts b/app/controllers/libraries_controller.ts new file mode 100644 index 0000000..60e67d1 --- /dev/null +++ b/app/controllers/libraries_controller.ts @@ -0,0 +1,44 @@ +import Library from '#models/library'; +import { paginationValidator } from '#validators/pagination'; +import { showValidator } from '#validators/show'; +import type { HttpContext } from '@adonisjs/core/http' + +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 }; + } +} From 856c646a6e877406d1d45970e5c0b284c3867b4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 21:04:01 +0100 Subject: [PATCH 11/12] feat: add routes for library controller --- app/controllers/buildings_controller.ts | 10 +++- app/controllers/campuses_controller.ts | 8 ++- app/controllers/libraries_controller.ts | 75 +++++++++++++------------ app/models/library.ts | 7 ++- app/models/regular_hour.ts | 3 +- database/seeders/building_seeder.ts | 41 ++++++++------ start/routes.ts | 8 +++ 7 files changed, 92 insertions(+), 60 deletions(-) diff --git a/app/controllers/buildings_controller.ts b/app/controllers/buildings_controller.ts index 76878f2..219cfa9 100644 --- a/app/controllers/buildings_controller.ts +++ b/app/controllers/buildings_controller.ts @@ -5,7 +5,15 @@ 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"]; + protected readonly relations = [ + "campus", + "aeds", + "bicycleShowers", + "foodSpots", + "libraries", + "libraries.regularHours", + "libraries.specialHours", + ]; /** * Display a list of resource diff --git a/app/controllers/campuses_controller.ts b/app/controllers/campuses_controller.ts index 6dbf742..1386d64 100644 --- a/app/controllers/campuses_controller.ts +++ b/app/controllers/campuses_controller.ts @@ -4,7 +4,13 @@ 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"]; + protected readonly relations = [ + "buildings", + "buildings.aeds", + "buildings.bicycleShowers", + "buildings.foodSpots", + "buildings.libraries", + ]; /** * Display a list of resource diff --git a/app/controllers/libraries_controller.ts b/app/controllers/libraries_controller.ts index 60e67d1..8622aff 100644 --- a/app/controllers/libraries_controller.ts +++ b/app/controllers/libraries_controller.ts @@ -1,44 +1,45 @@ -import Library from '#models/library'; -import { paginationValidator } from '#validators/pagination'; -import { showValidator } from '#validators/show'; -import type { HttpContext } from '@adonisjs/core/http' +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"]; + 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; + /** + * 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(); + /** + * 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 }; - } + return { data: library }; + } } diff --git a/app/models/library.ts b/app/models/library.ts index b026592..40c7bde 100644 --- a/app/models/library.ts +++ b/app/models/library.ts @@ -3,13 +3,14 @@ import { DateTime } from "luxon"; import { BaseModel, belongsTo, column, hasMany } from "@adonisjs/lucid/orm"; import type { BelongsTo, HasMany } from "@adonisjs/lucid/types/relations"; -import Building from "./building.js"; -import RegularHour from "./regular_hour.js"; -import SpecialHour from "./special_hour.js"; import { preloadRelations } from "#scopes/preload_helper"; import { handleSearchQuery } from "#scopes/search_helper"; import { handleSortQuery } from "#scopes/sort_helper"; +import Building from "./building.js"; +import RegularHour from "./regular_hour.js"; +import SpecialHour from "./special_hour.js"; + export default class Library extends BaseModel { @column({ isPrimary: true }) declare id: number; diff --git a/app/models/regular_hour.ts b/app/models/regular_hour.ts index 5fa4b32..cf7d787 100644 --- a/app/models/regular_hour.ts +++ b/app/models/regular_hour.ts @@ -3,9 +3,10 @@ import { DateTime } from "luxon"; import { BaseModel, belongsTo, column } from "@adonisjs/lucid/orm"; import type { BelongsTo } from "@adonisjs/lucid/types/relations"; -import Library from "./library.js"; import { Weekday } from "#enums/weekday"; +import Library from "./library.js"; + export default class RegularHour extends BaseModel { @column({ isPrimary: true }) declare id: number; diff --git a/database/seeders/building_seeder.ts b/database/seeders/building_seeder.ts index b76b637..9b1d328 100644 --- a/database/seeders/building_seeder.ts +++ b/database/seeders/building_seeder.ts @@ -1,13 +1,13 @@ +import { DateTime } from "luxon"; + import { BaseSeeder } from "@adonisjs/lucid/seeders"; +import { Weekday } from "#enums/weekday"; import Building from "#models/building"; import Campus from "#models/campus"; - -import { BuildingIcon } from "../../app/enums/building_icon.js"; import Library from "#models/library"; -import { Weekday } from "#enums/weekday"; -import { DateTime } from "luxon"; +import { BuildingIcon } from "../../app/enums/building_icon.js"; export default class BuildingSeeder extends BaseSeeder { static environment = ["development", "testing"]; @@ -65,8 +65,10 @@ export default class BuildingSeeder extends BaseSeeder { ]; const updatedBuildings: Building[] = []; - for(const [i, campus] of capmuses.entries()) { - updatedBuildings[i] = await campus.related("buildings").create(buildings[i]); + for (const [i, campus] of capmuses.entries()) { + updatedBuildings[i] = await campus + .related("buildings") + .create(buildings[i]); } const libraries = await Library.createMany([ @@ -154,22 +156,27 @@ export default class BuildingSeeder extends BaseSeeder { openTime: "10:00", closeTime: "15:30", }, - ]; - - for(const [i, library] of libraries.entries()) { - await library.related("regularHours").createMany([ - regularHours[0], regularHours[1], regularHours[2], regularHours[3], regularHours[4] - ]); + ]; - await library.related("specialHours").createMany([ - specialHours[0], specialHours[1], specialHours[2] - ]); + for (const [i, library] of libraries.entries()) { + await library + .related("regularHours") + .createMany([ + regularHours[0], + regularHours[1], + regularHours[2], + regularHours[3], + regularHours[4], + ]); + + await library + .related("specialHours") + .createMany([specialHours[0], specialHours[1], specialHours[2]]); if (i === 0) { await library.related("specialHours").create(specialHours[3]); } } - const aeds = [ { latitude: 40.7812, @@ -224,7 +231,7 @@ export default class BuildingSeeder extends BaseSeeder { photoUrl: "https://food_spot_photo1.jpg", }; - for(const [i, building] of updatedBuildings.entries()) { + for (const [i, building] of updatedBuildings.entries()) { await building.related("aeds").create(aeds[i]); if (i == 0 || i == 1) { await building.related("bicycleShowers").create(bicycleShowers[i]); diff --git a/start/routes.ts b/start/routes.ts index 7ae2bc5..287cfc9 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -31,6 +31,7 @@ const AcademicCalendarsController = () => import("#controllers/academic_calendars_controller"); const HolidaysController = () => import("#controllers/holidays_controller"); const DaySwapsController = () => import("#controllers/day_swaps_controller"); +const LibrariesController = () => import("#controllers/libraries_controller"); router.get("/", async () => { return { appName: env.get("APP_NAME"), version: env.get("APP_VERSION") }; @@ -57,6 +58,13 @@ router }) .prefix("api/v1/buildings"); +router + .group(() => { + router.get("/:id", [LibrariesController, "show"]); + router.get("/", [LibrariesController, "index"]); + }) + .prefix("api/v1/libraries"); + router .group(() => { router.get("/:id", [StudentOrganizationsController, "show"]); From ce1571ded3b060deb2982e2d450875b93ba55303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20P=C5=82aska?= Date: Mon, 20 Jan 2025 23:01:27 +0100 Subject: [PATCH 12/12] fix: fix operator= --- database/seeders/building_seeder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeders/building_seeder.ts b/database/seeders/building_seeder.ts index 9b1d328..d96384f 100644 --- a/database/seeders/building_seeder.ts +++ b/database/seeders/building_seeder.ts @@ -233,10 +233,10 @@ export default class BuildingSeeder extends BaseSeeder { for (const [i, building] of updatedBuildings.entries()) { await building.related("aeds").create(aeds[i]); - if (i == 0 || i == 1) { + if (i === 0 || i === 1) { await building.related("bicycleShowers").create(bicycleShowers[i]); } - if (i == 0) { + if (i === 0) { await building.related("foodSpots").create(foodSpot); } await libraries[i].merge({ buildingId: building.id }).save();