Skip to content

Commit

Permalink
Store area information in a separate database table
Browse files Browse the repository at this point in the history
  • Loading branch information
beverloo committed Jan 6, 2024
1 parent 1237534 commit 8788008
Show file tree
Hide file tree
Showing 9 changed files with 490 additions and 96 deletions.
4 changes: 3 additions & 1 deletion app/lib/database/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// Copyright 2023 Peter Beverloo & AnimeCon. All rights reserved.
// Use of this source code is governed by a MIT license that can be found in the LICENSE file.

import { ActivitiesTable } from './scheme/ActivitiesTable';
import { ActivitiesAreasTable } from './scheme/ActivitiesAreasTable';
import { ActivitiesLocationsTable } from './scheme/ActivitiesLocationsTable';
import { ActivitiesLogsTable } from './scheme/ActivitiesLogsTable';
import { ActivitiesTable } from './scheme/ActivitiesTable';
import { ActivitiesTimeslotsTable } from './scheme/ActivitiesTimeslotsTable';
import { ContentTable } from './scheme/ContentTable';
import { EventsTable } from './scheme/EventsTable';
Expand Down Expand Up @@ -40,6 +41,7 @@ import { VendorsTable } from './scheme/VendorsTable';
// Export instances of each of the above table types that are for the app to use. Naming convention
// matches that proposed by `ts-sql-query`, i.e. `FooTable` becomes `tFoo`.
export const tActivities = new ActivitiesTable;
export const tActivitiesAreas = new ActivitiesAreasTable;
export const tActivitiesLocations = new ActivitiesLocationsTable;
export const tActivitiesLogs = new ActivitiesLogsTable;
export const tActivitiesTimeslots = new ActivitiesTimeslotsTable;
Expand Down
35 changes: 35 additions & 0 deletions app/lib/database/scheme/ActivitiesAreasTable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// @ts-nocheck
/* eslint-disable quotes, max-len */
/**
* DO NOT EDIT:
*
* This file has been auto-generated from database schema using ts-sql-codegen.
* Any changes will be overwritten.
*/
import { Table } from "ts-sql-query/Table";
import type { DBConnection } from "../Connection";
import {
DateTimeTypeAdapter,
} from "../DateTimeTypeAdapter";
import {
ActivityType,
} from "../Types";
import {
DateTime,
} from "../../DateTime";

export class ActivitiesAreasTable extends Table<DBConnection, 'ActivitiesAreasTable'> {
areaId = this.column('area_id', 'int');
areaFestivalId = this.column('area_festival_id', 'int');
areaType = this.column<ActivityType>('area_type', 'enum', 'ActivityType');
areaName = this.column('area_name', 'string');
areaCreated = this.column<DateTime>('area_created', 'customComparable', 'dateTime', DateTimeTypeAdapter);
areaUpdated = this.column<DateTime>('area_updated', 'customComparable', 'dateTime', DateTimeTypeAdapter);
areaDeleted = this.optionalColumnWithDefaultValue<DateTime>('area_deleted', 'customComparable', 'dateTime', DateTimeTypeAdapter);

constructor() {
super('activities_areas');
}
}


3 changes: 2 additions & 1 deletion app/lib/database/scheme/ActivitiesLocationsTable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ import {
} from "../../DateTime";

export class ActivitiesLocationsTable extends Table<DBConnection, 'ActivitiesLocationsTable'> {
locationId = this.autogeneratedPrimaryKey('location_id', 'int');
locationId = this.column('location_id', 'int');
locationFestivalId = this.column('location_festival_id', 'int');
locationType = this.column<ActivityType>('location_type', 'enum', 'ActivityType');
locationName = this.column('location_name', 'string');
locationAreaId = this.column('location_area_id', 'int');
locationCreated = this.column<DateTime>('location_created', 'customComparable', 'dateTime', DateTimeTypeAdapter);
locationUpdated = this.column<DateTime>('location_updated', 'customComparable', 'dateTime', DateTimeTypeAdapter);
locationDeleted = this.optionalColumnWithDefaultValue<DateTime>('location_deleted', 'customComparable', 'dateTime', DateTimeTypeAdapter);
Expand Down
1 change: 1 addition & 0 deletions app/lib/database/scheme/ActivitiesLogsTable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
export class ActivitiesLogsTable extends Table<DBConnection, 'ActivitiesLogsTable'> {
festivalId = this.column('festival_id', 'int');
activityId = this.optionalColumnWithDefaultValue('activity_id', 'int');
areaId = this.optionalColumnWithDefaultValue('area_id', 'int');
timeslotId = this.optionalColumnWithDefaultValue('timeslot_id', 'int');
locationId = this.optionalColumnWithDefaultValue('location_id', 'int');
mutation = this.column<Mutation>('mutation', 'enum', 'Mutation');
Expand Down
2 changes: 1 addition & 1 deletion app/lib/integrations/animecon/AnimeConTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export const kLocationDefinition = z.object({
sponsor: z.string().nullable(),
area: z.string().nullable(),
floor: kFloorDefinition.optional(),
floorId: z.number().nullable(),
floorId: z.number(),
});

/**
Expand Down
138 changes: 131 additions & 7 deletions app/lib/scheduler/tasks/ImportActivitiesTask.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ describe('ImportActivitiesTask', () => {
endTime: dayjs('2024-06-09T09:30:00+00:00'),
locationId: 100,
locationName: 'Example location',
locationAreaId: 10,
locationAreaName: 'Example area',

...timeslot,
})),
Expand All @@ -54,7 +56,7 @@ describe('ImportActivitiesTask', () => {
function createSimpleFloor(floor: PartialWithRequiredId<Floor>): Floor {
return {
year: 2024,
name: 'Example floor',
name: 'Example area',
description: null,
cssBackgroundColor: null,
...floor,
Expand All @@ -67,9 +69,9 @@ describe('ImportActivitiesTask', () => {
name: 'Example location',
useName: null,
sponsor: null,
area: 'Example floor',
area: 'Example area',
floor: createSimpleFloor({ id: 10 }),
floorId: 1000,
floorId: 10,
...location,
};
}
Expand Down Expand Up @@ -280,30 +282,55 @@ describe('ImportActivitiesTask', () => {
const mutations = task.compareActivities([
createSimpleActivity({
id: 100,
timeslots: [ createSimpleTimeslot({ id: 1100 }) ]
timeslots: [
createSimpleTimeslot({
id: 1100
})
]
}),
createSimpleActivity({
id: 101,
timeslots: [ createSimpleTimeslot({ id: 1101 }) ]
timeslots: [
createSimpleTimeslot({
id: 1101,
location: createSimpleLocation({
id: 101,
area: 'New area',
floorId: 11,
})
})
]
}),
], [
createStoredActivity({ id: 100 }, /* timeslots= */ [ { id: 1100 } ]),
// Note: ID `101` (w/ timeslot `1101`) are missing

], /* festivalId= */ 625);

expect(mutations.created).toHaveLength(2); // activity + timeslot
expect(mutations.created).toHaveLength(4); // activity, timeslot, location and floor
expect(mutations.updated).toHaveLength(0);
expect(mutations.deleted).toHaveLength(0);

expect(mutations.mutations).toHaveLength(2);
expect(mutations.mutations).toHaveLength(4);
expect(mutations.mutations[0]).toEqual({
activityId: 101,
mutation: 'Created',
severity: 'Moderate',
});

expect(mutations.mutations[1]).toEqual({
areaId: 11,
mutation: 'Created',
severity: 'Moderate',
});

expect(mutations.mutations[2]).toEqual({
locationId: 101,
mutation: 'Created',
severity: 'Moderate',
});

expect(mutations.mutations[3]).toEqual({
activityId: 101,
activityTimeslotId: 1101,
mutation: 'Created',
Expand Down Expand Up @@ -456,6 +483,48 @@ describe('ImportActivitiesTask', () => {
});
});

it('should be able to identify updates to floors in the program', () => {
const task = createImportActivitiesTaskForFestival(
/* no festival= */ undefined, /* skipDb= */ true);

const mutations = task.compareActivities([
createSimpleActivity({
id: 100,
timeslots: [
createSimpleTimeslot({
id: 1100,
location: createSimpleLocation({
id: 11100,
area: 'New Floor Name',
floorId: 10,
}),
})
]
}),
], [
createStoredActivity({ id: 100 }, /* timeslots= */ [
{
id: 1100,
locationId: 11100,
locationAreaId: 10,
locationAreaName: 'Old Floor Name',
}
]),
], /* festivalId= */ 625);

expect(mutations.created).toHaveLength(0);
expect(mutations.updated).toHaveLength(1);
expect(mutations.deleted).toHaveLength(0);

expect(mutations.mutations).toHaveLength(1);
expect(mutations.mutations[0]).toEqual({
areaId: 10,
mutation: 'Updated',
mutatedFields: [ 'name' ],
severity: 'Low',
});
});

it('should be able to identify updates to locations in the program', () => {
const task = createImportActivitiesTaskForFestival(
/* no festival= */ undefined, /* skipDb= */ true);
Expand Down Expand Up @@ -591,6 +660,61 @@ describe('ImportActivitiesTask', () => {
});
});

it('should be able to identify removed floors from the program', () => {
const task = createImportActivitiesTaskForFestival(
/* no festival= */ undefined, /* skipDb= */ true);

const mutations = task.compareActivities([
createSimpleActivity({
id: 100,
timeslots: [
createSimpleTimeslot({
id: 1100,
location: createSimpleLocation({
id: 11100,
area: 'New Ace Area',
floorId: 11,
})
}),
createSimpleTimeslot({
id: 1101,
location: createSimpleLocation({
id: 11101,
area: 'New Ace Area',
floorId: 11,
}),
})
]
}),
], [
createStoredActivity({ id: 100 }, /* timeslots= */ [
{
id: 1100,
locationId: 11100,
locationAreaId: 10,
locationAreaName: 'Old Ace Area', // <-- no longer being used
},
{
id: 1101,
locationId: 11101,
locationAreaId: 11,
locationAreaName: 'New Ace Area',
}
]),
], /* festivalId= */ 625);

expect(mutations.created).toHaveLength(0);
expect(mutations.updated).toHaveLength(0);
expect(mutations.deleted).toHaveLength(1);

expect(mutations.mutations).toHaveLength(1);
expect(mutations.mutations[0]).toEqual({
areaId: 10,
mutation: 'Deleted',
severity: 'Moderate',
});
});

it('should be able to identify removed locations from the program', () => {
const task = createImportActivitiesTaskForFestival(
/* no festival= */ undefined, /* skipDb= */ true);
Expand Down
Loading

0 comments on commit 8788008

Please sign in to comment.