anonymous-student
Version:
Anonymous student is used to retrieve and save information from our website users.
150 lines (120 loc) • 5.44 kB
text/typescript
import { IEventAggregationService } from "@studyportals/event-aggregation-service-interface";
import { ITokenBasedSessionService } from '@studyportals/student-interfaces';
import { IStudent, StudentField } from '@studyportals/studentdomain';
import { Actor, AnonymousStudentStateChanged } from '../../interfaces';
import { AnonymousStudentEventBroadcaster } from '../infrastructure/anonymous-student-event-broadcaster';
import { OfflineToOnlineSynchronizationService } from './services/offline-to-online-synchronization-service';
import { OfflineStudentRepositoryState } from './states/offline-student-repository-state';
import { OnlineStudentRepositoryState } from './states/online-student-repository-state';
import { PendingStudentRepositoryState } from './states/pending-student-repository-state';
import { StudentRepositoryState } from './states/student-repository-state';
export class StudentRepository {
private state: StudentRepositoryState;
public readonly pendingState: StudentRepositoryState;
public readonly offlineState: OfflineStudentRepositoryState;
public readonly onlineState: OnlineStudentRepositoryState;
public readonly offlineToOnlineSynchronizationService: OfflineToOnlineSynchronizationService;
public readonly anonymousStudentEventBroadcaster: AnonymousStudentEventBroadcaster;
constructor(eventAggregationService: IEventAggregationService, sessionService: ITokenBasedSessionService) {
this.anonymousStudentEventBroadcaster = this.createAnonymousStudentEventBroadcaster(eventAggregationService);
this.pendingState = this.createPendingStudentRepositoryState(eventAggregationService, sessionService);
this.offlineState = this.createOfflineStudentRepositoryState(eventAggregationService, sessionService);
this.onlineState = this.createOnlineStudentRepositoryState(eventAggregationService, sessionService);
this.offlineToOnlineSynchronizationService = this.createOfflineToOnlineSynchronizationService();
this.state = this.pendingState;
}
public initialize(): void {
this.offlineState.initialize();
this.onlineState.initialize();
this.pendingState.initialize();
}
public async setStudentData(studentData: IStudent, actor: Actor): Promise<void> {
await this.state.setStudentData(studentData, actor);
}
public async getStudentData(studentFields: StudentField[]): Promise<IStudent> {
const studentData = await this.state.getStudentData(studentFields);
const studentDataKeys = Object.keys(studentData);
studentFields.forEach((field) => {
if (!studentDataKeys.includes(field)) {
studentData[field] = undefined;
}
});
return studentData;
}
public async getStudentDataCompleteness(studentFields: StudentField[]): Promise<number> {
const studentData = await this.getStudentData(studentFields);
const completeFields = studentFields.filter((field) => {
return studentData[field] !== undefined;
});
return completeFields.length / studentFields.length;
}
public addToCollection(type: StudentField, items: any[]): Promise<void> {
return this.state.addToCollection(type, items);
}
public removeFromCollection(type: StudentField, items: any[]): Promise<void> {
return this.state.removeFromCollection(type, items);
}
public async setGPA(grade_type: string, grade_value: any): Promise<void> {
const data = {
gpa: {
[grade_type]: grade_value,
current_type: grade_type
}
};
return this.setStudentData(data, Actor.USER);
}
public async setName(name: string): Promise<void> {
const firstSpace = name.indexOf(' ', 0);
let first_name: string | undefined;
let last_name: string | undefined;
if (firstSpace !== -1) {
first_name = name.substring(0, firstSpace);
last_name = name.substring(firstSpace).trim();
} else {
first_name = name;
last_name = undefined;
}
const data = {
name,
first_name,
last_name
};
return this.setStudentData(data, Actor.USER);
}
public updateState(state: StudentRepositoryState): void {
const oldState = this.state;
this.state = state;
const event = new AnonymousStudentStateChanged(new Date(), oldState.stateType, state.stateType);
this.anonymousStudentEventBroadcaster.broadcastStateChangedEvent(event);
}
private createPendingStudentRepositoryState(eventAggregationService: IEventAggregationService, sessionService: ITokenBasedSessionService): StudentRepositoryState {
return new PendingStudentRepositoryState(
eventAggregationService,
sessionService,
this
);
}
private createOnlineStudentRepositoryState(eventAggregationService: IEventAggregationService, sessionService: ITokenBasedSessionService): OnlineStudentRepositoryState {
return new OnlineStudentRepositoryState(
eventAggregationService,
sessionService,
this
);
}
private createOfflineStudentRepositoryState(eventAggregationService: IEventAggregationService, sessionService: ITokenBasedSessionService): OfflineStudentRepositoryState {
return new OfflineStudentRepositoryState(
eventAggregationService,
sessionService,
this
);
}
private createOfflineToOnlineSynchronizationService(): OfflineToOnlineSynchronizationService {
return new OfflineToOnlineSynchronizationService(
this.offlineState,
this.onlineState
);
}
private createAnonymousStudentEventBroadcaster(eventAggregationService: IEventAggregationService): AnonymousStudentEventBroadcaster {
return new AnonymousStudentEventBroadcaster(eventAggregationService);
}
}