134 lines
4.2 KiB
TypeScript
134 lines
4.2 KiB
TypeScript
import * as dotenv from 'dotenv';
|
|
import {Event} from './Event.interface';
|
|
import {Change} from './Change.interface';
|
|
import {RaPlaChangesDB} from '../DHBWRaPlaChanges.db';
|
|
|
|
dotenv.config();
|
|
|
|
export const getChanges = async (course: string, week: string): Promise<Event[]> => {
|
|
let conn = await RaPlaChangesDB.getConnection();
|
|
try {
|
|
let relevantEventsRows = await conn.query('SELECT DISTINCT(entry_id) FROM rapla_changes WHERE new_start > ? AND new_start < DATE_ADD(?, INTERVAL 7 DAY)', [week, week]);
|
|
|
|
let relevantEventIds: string[] = [];
|
|
relevantEventsRows.forEach((row: { entry_id: string; }) => {
|
|
relevantEventIds.push(row.entry_id);
|
|
});
|
|
|
|
if (relevantEventIds.length < 1) {
|
|
return [];
|
|
}
|
|
|
|
let rows = await conn.query('SELECT c.change_id, c.entry_id, c.change_timestamp, c.isDeleted, c.new_summary, c.new_description, c.new_start, c.new_last_modified, c.new_end, c.new_created, c.new_location, c.new_organizer, c.new_categories, e.uid FROM rapla_changes c LEFT OUTER JOIN rapla_entries e ON c.entry_id = e.entry_id WHERE c.entry_id IN (?) ORDER BY c.change_id', [relevantEventIds]);
|
|
|
|
let eventsMap = new Map();
|
|
|
|
for (let row of rows) {
|
|
let change: Change = {
|
|
change_id: row.change_id,
|
|
event_id: row.event_id,
|
|
change_timestamp: row.change_timestamp,
|
|
is_deleted: row.isDeleted,
|
|
new_summary: row.new_summary,
|
|
new_description: row.new_description,
|
|
new_start: row.new_start,
|
|
new_end: row.new_end,
|
|
new_last_modified: row.new_last_modified,
|
|
new_created: row.new_created,
|
|
new_location: row.new_location,
|
|
new_organizer: row.new_organizer,
|
|
new_categories: row.new_categories,
|
|
new_recurring: row.new_recurring
|
|
};
|
|
|
|
if (eventsMap.has(row.entry_id)) {
|
|
let event = eventsMap.get(row.entry_id);
|
|
|
|
// Only adjust these fields if the event is not deleted as otherwise they would be null
|
|
if (!row.isDeleted) {
|
|
event.latest_event_summary = row.new_summary;
|
|
event.latest_start_date = row.new_start;
|
|
}
|
|
event.changes.push(change);
|
|
|
|
eventsMap.set(row.entry_id, event);
|
|
} else {
|
|
let event: Event = {
|
|
event_id: row.event_id,
|
|
event_uid: row.uid,
|
|
latest_event_summary: row.new_summary,
|
|
latest_start_date: row.new_start,
|
|
changes: [change]
|
|
};
|
|
|
|
eventsMap.set(row.entry_id, event);
|
|
}
|
|
}
|
|
|
|
return Array.from(eventsMap.values()) as Event[];
|
|
} catch (err) {
|
|
throw err;
|
|
} finally {
|
|
// Return connection
|
|
await conn.end();
|
|
}
|
|
};
|
|
|
|
export const getEventById = async (course: string, id: string): Promise<Event> => {
|
|
let conn = await RaPlaChangesDB.getConnection();
|
|
try {
|
|
let rows = await conn.query('SELECT c.change_id, c.entry_id, c.change_timestamp, c.isDeleted, c.new_summary, c.new_description, c.new_start, c.new_last_modified, c.new_end, c.new_created, c.new_location, c.new_organizer, c.new_categories, e.uid FROM rapla_changes c LEFT OUTER JOIN rapla_entries e ON c.entry_id = e.entry_id WHERE e.uid = ? ORDER BY c.change_id', id);
|
|
|
|
let eventsMap = new Map();
|
|
|
|
for (let row of rows) {
|
|
let change: Change = {
|
|
change_id: row.change_id,
|
|
event_id: row.event_id,
|
|
change_timestamp: row.change_timestamp,
|
|
is_deleted: row.isDeleted,
|
|
new_summary: row.new_summary,
|
|
new_description: row.new_description,
|
|
new_start: row.new_start,
|
|
new_end: row.new_end,
|
|
new_last_modified: row.new_last_modified,
|
|
new_created: row.new_created,
|
|
new_location: row.new_location,
|
|
new_organizer: row.new_organizer,
|
|
new_categories: row.new_categories,
|
|
new_recurring: row.new_recurring
|
|
};
|
|
|
|
if (eventsMap.has(row.entry_id)) {
|
|
let event = eventsMap.get(row.entry_id);
|
|
|
|
// Only adjust these fields if the event is not deleted as otherwise they would be null
|
|
if (!row.isDeleted) {
|
|
event.latest_event_summary = row.new_summary;
|
|
event.latest_start_date = row.new_start;
|
|
}
|
|
event.changes.push(change);
|
|
|
|
eventsMap.set(row.entry_id, event);
|
|
} else {
|
|
let event: Event = {
|
|
event_id: row.event_id,
|
|
event_uid: row.uid,
|
|
latest_event_summary: row.new_summary,
|
|
latest_start_date: row.new_start,
|
|
changes: [change]
|
|
};
|
|
|
|
eventsMap.set(row.entry_id, event);
|
|
}
|
|
}
|
|
|
|
return Array.from(eventsMap.values())[0];
|
|
} catch (err) {
|
|
throw err;
|
|
} finally {
|
|
// Return connection
|
|
await conn.end();
|
|
}
|
|
};
|