Add authentication #17
2 changed files with 69 additions and 0 deletions
|
@ -601,6 +601,8 @@ export class DataSyncService {
|
||||||
return db.users;
|
return db.users;
|
||||||
case Collections.EVENTS:
|
case Collections.EVENTS:
|
||||||
return db.events;
|
return db.events;
|
||||||
|
case Collections.EVENT_ATTENDEES:
|
||||||
|
return db.eventAttendees;
|
||||||
case Collections.EVENT_REQUESTS:
|
case Collections.EVENT_REQUESTS:
|
||||||
return db.eventRequests;
|
return db.eventRequests;
|
||||||
case Collections.LOGS:
|
case Collections.LOGS:
|
||||||
|
@ -619,6 +621,62 @@ export class DataSyncService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store an event code in local storage for offline check-in
|
||||||
|
* This is used when a user scans a QR code but is offline
|
||||||
|
* @param eventCode The event code to store
|
||||||
|
*/
|
||||||
|
public async storeEventCode(eventCode: string): Promise<void> {
|
||||||
|
if (!isBrowser) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Store in localStorage instead of IndexedDB for security
|
||||||
|
localStorage.setItem('pending_event_code', eventCode);
|
||||||
|
localStorage.setItem('pending_event_code_timestamp', Date.now().toString());
|
||||||
|
console.log('Event code stored for offline check-in');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error storing event code:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the stored event code from local storage
|
||||||
|
*/
|
||||||
|
public async clearEventCode(): Promise<void> {
|
||||||
|
if (!isBrowser) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
localStorage.removeItem('pending_event_code');
|
||||||
|
localStorage.removeItem('pending_event_code_timestamp');
|
||||||
|
console.log('Event code cleared');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error clearing event code:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the stored event code from local storage
|
||||||
|
* @returns The stored event code, or null if none exists
|
||||||
|
*/
|
||||||
|
public async getStoredEventCode(): Promise<{ code: string; timestamp: number } | null> {
|
||||||
|
if (!isBrowser) return null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const code = localStorage.getItem('pending_event_code');
|
||||||
|
const timestamp = localStorage.getItem('pending_event_code_timestamp');
|
||||||
|
|
||||||
|
if (!code || !timestamp) return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
code,
|
||||||
|
timestamp: parseInt(timestamp)
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting stored event code:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Purge event_code fields from events in IndexedDB for security
|
* Purge event_code fields from events in IndexedDB for security
|
||||||
* This should be called on login to ensure no event codes are stored
|
* This should be called on login to ensure no event codes are stored
|
||||||
|
|
|
@ -8,6 +8,7 @@ import type {
|
||||||
Reimbursement,
|
Reimbursement,
|
||||||
Receipt,
|
Receipt,
|
||||||
Sponsor,
|
Sponsor,
|
||||||
|
EventAttendee,
|
||||||
} from "../../schemas/pocketbase/schema";
|
} from "../../schemas/pocketbase/schema";
|
||||||
|
|
||||||
// Check if we're in a browser environment
|
// Check if we're in a browser environment
|
||||||
|
@ -29,6 +30,7 @@ interface OfflineChange {
|
||||||
export class DashboardDatabase extends Dexie {
|
export class DashboardDatabase extends Dexie {
|
||||||
users!: Dexie.Table<User, string>;
|
users!: Dexie.Table<User, string>;
|
||||||
events!: Dexie.Table<Event, string>;
|
events!: Dexie.Table<Event, string>;
|
||||||
|
eventAttendees!: Dexie.Table<EventAttendee, string>;
|
||||||
eventRequests!: Dexie.Table<EventRequest, string>;
|
eventRequests!: Dexie.Table<EventRequest, string>;
|
||||||
logs!: Dexie.Table<Log, string>;
|
logs!: Dexie.Table<Log, string>;
|
||||||
officers!: Dexie.Table<Officer, string>;
|
officers!: Dexie.Table<Officer, string>;
|
||||||
|
@ -63,6 +65,12 @@ export class DashboardDatabase extends Dexie {
|
||||||
offlineChanges:
|
offlineChanges:
|
||||||
"id, collection, recordId, operation, timestamp, synced, syncAttempts",
|
"id, collection, recordId, operation, timestamp, synced, syncAttempts",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add version 3 with eventAttendees table and updated events table (no attendees field)
|
||||||
|
this.version(3).stores({
|
||||||
|
events: "id, event_name, event_code, start_date, end_date, published",
|
||||||
|
eventAttendees: "id, user, event, time_checked_in",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the database with default values
|
// Initialize the database with default values
|
||||||
|
@ -70,6 +78,7 @@ export class DashboardDatabase extends Dexie {
|
||||||
const collections = [
|
const collections = [
|
||||||
"users",
|
"users",
|
||||||
"events",
|
"events",
|
||||||
|
"event_attendees",
|
||||||
"event_request",
|
"event_request",
|
||||||
"logs",
|
"logs",
|
||||||
"officers",
|
"officers",
|
||||||
|
@ -155,6 +164,7 @@ export class DexieService {
|
||||||
const db = this.db as DashboardDatabase;
|
const db = this.db as DashboardDatabase;
|
||||||
await db.users.clear();
|
await db.users.clear();
|
||||||
await db.events.clear();
|
await db.events.clear();
|
||||||
|
await db.eventAttendees.clear();
|
||||||
await db.eventRequests.clear();
|
await db.eventRequests.clear();
|
||||||
await db.logs.clear();
|
await db.logs.clear();
|
||||||
await db.officers.clear();
|
await db.officers.clear();
|
||||||
|
@ -167,6 +177,7 @@ export class DexieService {
|
||||||
const collections = [
|
const collections = [
|
||||||
"users",
|
"users",
|
||||||
"events",
|
"events",
|
||||||
|
"event_attendees",
|
||||||
"event_request",
|
"event_request",
|
||||||
"logs",
|
"logs",
|
||||||
"officers",
|
"officers",
|
||||||
|
|
Loading…
Reference in a new issue