Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
a1a3206
Abfrage hinzugefügt, um Text an Single oder multiplechoice Fragen anz…
esthako Nov 27, 2024
d3e3921
quiz-student-participation angepasst
esthako Nov 27, 2024
39df6bd
Merge branch 'ecomod-code:main' into language
esthako Nov 27, 2024
0bf239c
Corrected the title length control to >0 instead of >3
esthako Nov 27, 2024
92d4b52
Merge branch 'language' of github.com:esthako/recapp into language
esthako Nov 27, 2024
02e9788
Included TITLE_MIN_CHARACTER constant
esthako Nov 27, 2024
291dd69
Anpassung Quiz-Teilnahme, Texte und Übersetzungen, zusätzliche Proper…
hbel Dec 2, 2024
225b013
JWT added to Template
hbel Dec 2, 2024
a88a56b
Merge branch 'ecomod-code:main' into language
esthako Dec 3, 2024
c6229c6
Merge pull request #24 from esthako/language
bitbacchus Dec 4, 2024
debc9cf
Merge pull request #25 from ecomod-code/main
bitbacchus Dec 4, 2024
41b4f2c
Bug fix
esthako Dec 4, 2024
ac37dd0
Merge pull request #27 from esthako/language
esthako Dec 4, 2024
a33e5a0
Merge pull request #28 from ecomod-code/main
esthako Dec 4, 2024
804ccd0
Bug fix 2: change multiple and single to match the correct question t…
esthako Dec 4, 2024
de6bc0d
Merge branch 'ecomod-code:main' into language
esthako Dec 4, 2024
55f8cf0
Merge pull request #29 from esthako/language
esthako Dec 4, 2024
212b122
EIntrittsquiz an temp accounts speichern.
hbel Dec 5, 2024
dddacb9
Type corrections
hbel Dec 5, 2024
3129a60
Added activate-correct-answer msgid to the js files
esthako Dec 7, 2024
5d589c4
Merge pull request #31 from esthako/language
esthako Dec 7, 2024
92287d7
activate-correct-answer somehow must have gotten lost in the first co…
esthako Dec 7, 2024
debceaa
Merge pull request #32 from esthako/language
esthako Dec 7, 2024
4a14d2d
Bugfxies temp accounts, Fingerprint storage.
hbel Dec 9, 2024
4235aac
Fingerprint-Administration und Anpassungen an den Berechtigungen.
hbel Dec 10, 2024
00a6d39
Changed name of preview button to Participant and Teacher view.
esthako Dec 11, 2024
6a6f7f3
Merge pull request #33 from esthako/preview_button
esthako Dec 11, 2024
56c0ad3
Added the tooltip for the preview button
esthako Dec 11, 2024
4b24735
Changed the preview button to a button with tooltip
esthako Dec 11, 2024
5900030
Merge pull request #34 from esthako/preview_button
esthako Dec 11, 2024
50c74e6
Added warning message when new questions are disabled because partici…
esthako Dec 11, 2024
923605a
Added isParticipationDisabled helper function
esthako Dec 11, 2024
92577c5
Bei Fragen von Temps den Fingerprint im Tooltip anzeigen.
hbel Dec 11, 2024
bfa293d
Version bump
hbel Dec 11, 2024
93950cb
Merge pull request #35 from ecomod-code/temporary-accounts
hbel Dec 11, 2024
5780dd3
Added isParticipationDisabled check and warning to quit-student-parti…
esthako Dec 11, 2024
dfd4c63
Merge branch 'main' of github.com:ecomod-code/recapp into testing
hbel Dec 11, 2024
292605d
Fixed typo
esthako Dec 11, 2024
c94bff0
Merge pull request #36 from esthako/isParticipationEnabled
esthako Dec 11, 2024
43d345d
Fix: Retain quiz and question id's via URI queries to restore state o…
hbel Dec 11, 2024
1ddee30
Merge branch 'main' into preview_button
esthako Dec 11, 2024
2aec113
Merge pull request #37 from esthako/preview_button
esthako Dec 11, 2024
810440b
Merge pull request #39 from ecomod-code/main
esthako Dec 11, 2024
a59bbac
Updated tooltip text for preview button
esthako Dec 11, 2024
60ea388
Merge pull request #40 from esthako/preview_button
esthako Dec 11, 2024
a70c897
Merge pull request #41 from ecomod-code/main
esthako Dec 11, 2024
2709e18
Merge branch 'ecomod-code:main' into isParticipationEnabled
esthako Dec 11, 2024
7b67b66
updated warning message for participation disabled
esthako Dec 11, 2024
65638d2
Merge branch 'isParticipationEnabled' of github.com:esthako/recapp in…
esthako Dec 11, 2024
234dfac
Merge pull request #38 from ecomod-code/bugfix_reload_question_form
esthako Dec 12, 2024
16a34ff
Commented warning out until functionality is implemented
esthako Dec 13, 2024
3215b77
Merge branch 'testing' into isParticipationEnabled
esthako Dec 13, 2024
e7938b7
Merge pull request #42 from esthako/isParticipationEnabled
esthako Dec 13, 2024
8f3e78d
Merge branch 'main' into testing
esthako Dec 14, 2024
183fe5f
Merge pull request #43 from ecomod-code/testing
esthako Dec 14, 2024
69394eb
Added msgids for question and new question for breadcrumb navigation
esthako Dec 14, 2024
3108528
Updated breadcrumb to have a translation for question and new question
esthako Dec 14, 2024
280c8d4
Merge pull request #44 from esthako/language
esthako Dec 14, 2024
7e9c113
Merge pull request #45 from ecomod-code/main
esthako Dec 14, 2024
9479f68
Refactoring -> Dashboard.tsx into pages
esthako Dec 17, 2024
30de7ec
Merge pull request #46 from esthako/refactoring
esthako Dec 17, 2024
4bb3c0b
This belongs to a different branch...I am stupid
esthako Dec 17, 2024
f6edb60
Merge branch 'ecomod-code:main' into refactoring
esthako Dec 17, 2024
768380e
Merge pull request #47 from esthako/refactoring
esthako Dec 17, 2024
baa0c15
Translation problem with placeholder
esthako Dec 18, 2024
80d642d
Merge pull request #49 from esthako/addTeachers
esthako Dec 18, 2024
dae961e
Merge pull request #48 from ecomod-code/main
esthako Dec 18, 2024
50bc409
Added gernders to Nutzer*in, Benutzer*in, ... and changed warning
esthako Dec 18, 2024
2e1995b
Merge branch 'ecomod-code:main' into addTeachers
esthako Jan 8, 2025
ae4413e
Merge pull request #50 from esthako/addTeachers
esthako Jan 8, 2025
45882cc
Merge pull request #51 from ecomod-code/main
esthako Jan 8, 2025
ad5ffc4
Nutzer zu Nutzer*innen
esthako Jan 8, 2025
58f87d8
Changed name of button to share quiz with teachers
esthako Jan 8, 2025
0f7cfd5
Added tooltip for share-with-confirmed-users button.
esthako Jan 8, 2025
f729dc5
Merge branch 'ecomod-code:main' into addTeachers
esthako Jan 8, 2025
64780f9
Merge pull request #52 from esthako/addTeachers
esthako Jan 8, 2025
83f6396
Merge pull request #53 from ecomod-code/main
esthako Jan 8, 2025
fd3d497
Changed share with confirmed users button to button with tooltip
esthako Jan 8, 2025
69d44af
Merge branch 'addTeachers' of github.com:esthako/recapp into addTeachers
esthako Jan 8, 2025
9298d4b
Merge pull request #54 from esthako/addTeachers
esthako Jan 8, 2025
4f05ad7
Merge pull request #55 from ecomod-code/main
esthako Jan 8, 2025
d781161
Changed share-quiz-model.button-label.add to a button with tooltip
esthako Jan 8, 2025
33ea684
Fix
esthako Jan 8, 2025
f670df7
Merge pull request #56 from esthako/addTeachers
esthako Jan 8, 2025
94f2067
Merge pull request #57 from ecomod-code/main
esthako Jan 8, 2025
2cebb9d
Upvoted comments should be indicated by green colour
esthako Jan 8, 2025
dfa0954
Merge pull request #58 from esthako/addTeachers
esthako Jan 8, 2025
d774d10
Merge pull request #59 from ecomod-code/testing
esthako Jan 8, 2025
fc19d17
remove upvote colouring
esthako Jan 8, 2025
55bde5b
Merge branch 'ecomod-code:main' into addTeachers
esthako Jan 8, 2025
f2608b8
Merge pull request #60 from esthako/addTeachers
esthako Jan 8, 2025
fd55014
Merge pull request #61 from ecomod-code/main
esthako Jan 8, 2025
20ec832
nickname to pseudonym
esthako Jan 15, 2025
8fdc061
Merge pull request #62 from esthako/language
esthako Jan 15, 2025
82f0e04
Merge pull request #63 from ecomod-code/main
esthako Jan 15, 2025
6666969
Testing to display question number in statistics view
esthako Jan 15, 2025
d6b47f4
Merge pull request #64 from esthako/questionNumber
esthako Jan 15, 2025
08d4371
Merge pull request #65 from ecomod-code/testing
esthako Jan 15, 2025
7495c23
Removed margin around stats
esthako Jan 15, 2025
1f8c71a
Merge pull request #66 from esthako/design
esthako Jan 15, 2025
1445383
Merge pull request #67 from ecomod-code/testing
esthako Jan 15, 2025
b4e3749
Change color of upvote button when upvoted
esthako Jan 22, 2025
a839e53
Merge pull request #68 from esthako/comments
esthako Jan 22, 2025
e371659
includes not in...this is not python
esthako Jan 22, 2025
06a62fd
Merge pull request #69 from esthako/comments
esthako Jan 22, 2025
2de3c36
Deleted edit button in dashboard
esthako Jan 22, 2025
bf31e67
Merge pull request #70 from esthako/design
esthako Jan 22, 2025
801c577
Merge pull request #71 from ecomod-code/testing
esthako Jan 22, 2025
ae311cd
added label for stop button in dashboard
esthako Jan 26, 2025
76dac5e
Added a stop button in Dashboard when quiz is started
esthako Jan 26, 2025
6af392f
Delete comment
esthako Jan 26, 2025
cae6c3f
Merge pull request #72 from esthako/design
esthako Jan 27, 2025
eeef5fd
Merge pull request #73 from ecomod-code/testing
esthako Jan 27, 2025
4a8892a
Version bumb -> 1.6.1
bitbacchus Jan 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ API_KEYS=ADDUIDSYOUWANTTOUSEASAPIKEYS_AS_A_COMMA_SEPERATED_LIST
MONGODB_PORT=26182
MONGODB_USER=recapp
MONGODB_PW=YOURMONGOPW

JWT_SECRET=YOURJWTSECRET
136 changes: 136 additions & 0 deletions packages/backend/src/actors/FingerprintStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import { Timestamp, Unit, toTimestamp, unit } from "itu-utils";
import { ActorRef, ActorSystem } from "ts-actors";
import { create } from "mutative";
import { ActorUri, Fingerprint, FingerprintStoreMessage, FingerprintStoreMessages, FingerprintUpdateMessage, Id, User, UserStoreMessage, UserStoreMessages } from "@recapp/models";
import { identity, pick } from "rambda";
import { CollecionSubscription, SubscribableActor } from "./SubscribableActor";

type FingerprintStoreResult = Unit | Error | Fingerprint | boolean;

type FingerprintStoreState = {
cache: Map<Id, Fingerprint>;
lastTouched: Map<Id, Timestamp>;
subscribers: Map<Id, Set<ActorUri>>;
collectionSubscribers: Map<ActorUri, CollecionSubscription>;
lastSeen: Map<ActorUri, Timestamp>;
};

export class FingerprintStore extends SubscribableActor<Fingerprint, FingerprintStoreMessage, FingerprintStoreResult> {
protected override state: FingerprintStoreState = { cache: new Map(), lastTouched: new Map(), subscribers: new Map(), collectionSubscribers: new Map(), lastSeen: new Map() };

public constructor(name: string, system: ActorSystem) {
super(name, system, "fingerprints");
}

protected override updateIndices(_draft: FingerprintStoreState, _entity: Fingerprint): void {
// No index needed for fingerprints
}

private updateSubscribers(fingerprint: Partial<Fingerprint> & { uid : Id }) {
for (const [subscriber, subscription] of this.state.collectionSubscribers) {
this.send(
subscriber,
new FingerprintUpdateMessage(
subscription.properties.length > 0
? pick(subscription.properties, fingerprint)
: fingerprint
)
);
}
for (const subscriber of this.state.subscribers.get(fingerprint.uid) ?? new Set()) {
this.send(subscriber, new FingerprintUpdateMessage(fingerprint));
}
}

public async receive(from: ActorRef, message: FingerprintStoreMessage): Promise<FingerprintStoreResult> {
const [clientUserRole, clientUserId] = await this.determineRole(from);
if (!["ADMIN", "SYSTEM"].includes(clientUserRole)) {
return new Error(`Operation not allowed`);
}
const result = await FingerprintStoreMessages.match<Promise<FingerprintStoreResult>>(message, {
StoreFingerprint: async fingerprint => {
this.state = await create(this.state, async draft => {
const currentFingerprint = (await this.getEntity(fingerprint.uid)).orElse({} as Fingerprint);
fingerprint.updated = toTimestamp();
const newFingerprint = { ...currentFingerprint, ...fingerprint };
draft.cache.set(fingerprint.uid, newFingerprint);
console.debug("SToring new fingerprint", newFingerprint);
this.storeEntity(newFingerprint);
});
return unit();
},
Get: async id => {
const result = await this.getEntity(id);
const retVal = result.match<Error | Fingerprint>(identity, () => new Error(`Unknown fingerprint id ${id}`));
return Promise.resolve(retVal)
},
Block: async id => {
const mbFingerprint = await this.getEntity(id)
const {uid} = await this.ask<UserStoreMessage, User>("actors://recapp-backend/UserStore", UserStoreMessages.GetByFingerprint(id));
return mbFingerprint.match<Unit|Error>(
fp => {
this.storeEntity({...fp, blocked: true});
this.updateSubscribers({...fp, blocked: true})
if (uid)
this.send("actors://recapp-backend/UserStore", UserStoreMessages.Update({ uid: fp.uid, active: false }));
return unit();
},
() => {
return new Error(`Unknown fingerprint id ${id}`);
}
)
},
Unblock: async id => {
const mbFingerprint = await this.getEntity(id)
const {uid} = await this.ask<UserStoreMessage, User>("actors://recapp-backend/UserStore", UserStoreMessages.GetByFingerprint(id));
return mbFingerprint.match<Unit|Error>(
fp => {
this.storeEntity({...fp, blocked: false});
this.updateSubscribers({...fp, blocked: false})
if (uid)
this.send("actors://recapp-backend/UserStore", UserStoreMessages.Update({ uid: fp.uid, active: true }));
return unit();
},
() => {
return new Error(`Unknown fingerprint id ${id}`);
}
)
},
IncreaseCount: async ({fingerprint, userUid, initialQuiz}) => {
const mbFingerprint = await this.getEntity(fingerprint)
return mbFingerprint.match<Unit|Error>(
fp => {
this.storeEntity({...fp, usageCount: fp.usageCount + 1, lastSeen: toTimestamp(), userUid, initialQuiz: initialQuiz ?? fp.initialQuiz});
this.updateSubscribers({...fp, usageCount: fp.usageCount + 1, lastSeen: toTimestamp(), userUid, initialQuiz: initialQuiz ?? fp.initialQuiz})
return unit();
},
() => {
return new Error(`Unknown fingerprint id ${fingerprint}`);
}
)
},
GetMostRecent: async () => {
const db = await this.connector.db();
const fps = await db.collection<Fingerprint>(this.collectionName).find({}).sort({lastSeen: 1}).limit(100).toArray();
fps.forEach(fp => {
const { _id, ...rest } = fp;
this.send(from, new FingerprintUpdateMessage(rest));
});
return unit();
},
SubscribeToCollection: async () => {
this.state = create(this.state, draft => {
draft.lastSeen.set(from.name as ActorUri, toTimestamp());
draft.collectionSubscribers.set(from.name as ActorUri, {
properties: [],
userId: clientUserId,
userRole: clientUserRole,
});
});
return unit();
},
default: async () => new Error(`Unknown message from ${from.name}: ${JSON.stringify(message, undefined, 2)}`),
});
return result;
}
}
15 changes: 14 additions & 1 deletion packages/backend/src/actors/QuizActor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,12 @@ export class QuizActor extends SubscribableActor<Quiz, QuizActorMessage, ResultT
public async receive(from: ActorRef, message: QuizActorMessage): Promise<ResultType> {
console.log("QUIZACTOR", from.name, message);
try {
const [clientUserRole, clientUserId] = await this.determineRole(from);
const [clientUserRole, clientUserId, clientIsTemporary] = await this.determineRole(from);
return await QuizActorMessages.match<Promise<ResultType>>(message, {
Create: async quiz => {
if (clientIsTemporary){
return serializeError(new Error("Cannot export as a temporary user"));
}
return this.create(quiz, clientUserRole, clientUserId);
},
GetUserRun: async ({ studentId, quizId }) => {
Expand Down Expand Up @@ -385,6 +388,9 @@ export class QuizActor extends SubscribableActor<Quiz, QuizActorMessage, ResultT
return unit();
},
Import: async ({ filename, titlePrefix, userId, userRole }) => {
if (clientIsTemporary){
return serializeError(new Error("Cannot export as a temporary user"));
}
console.log(filename);
const jsonBuffer = await readFile(path.join("./downloads", filename));
const importedObject = JSON.parse(jsonBuffer.toString());
Expand Down Expand Up @@ -446,6 +452,7 @@ export class QuizActor extends SubscribableActor<Quiz, QuizActorMessage, ResultT
q.quiz = uid;
q.authorId = userId ?? clientUserId;
q.authorName = userData.username;
q.authorFingerprint = userData.fingerprint;
q.created = toTimestamp();
q.updated = toTimestamp();
await db.collection("questions").insertOne(q);
Expand All @@ -469,6 +476,9 @@ export class QuizActor extends SubscribableActor<Quiz, QuizActorMessage, ResultT
return uid;
},
Export: async uid => {
if (clientIsTemporary){
return serializeError(new Error("Cannot export as a temporary user"));
}
const db = await this.connector.db();
const mbQuiz = maybe(await db.collection<Quiz>(this.collectionName).findOne({ uid }));
return mbQuiz.match<Promise<Error | string>>(
Expand Down Expand Up @@ -516,6 +526,9 @@ export class QuizActor extends SubscribableActor<Quiz, QuizActorMessage, ResultT
);
},
Duplicate: async uid => {
if (clientIsTemporary){
return serializeError(new Error("Cannot export as a temporary user"));
}
try {
const filename = (await this.ask(this.ref, QuizActorMessages.Export(uid))) as string | Error;
if (typeof filename === "string") {
Expand Down
10 changes: 5 additions & 5 deletions packages/backend/src/actors/StoringActor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ export abstract class StoringActor<Entity extends Document & { updated: Timestam
clearInterval(this.checkInterval);
}

protected determineRole = async (from: ActorRef): Promise<[AccessRole, Id]> => {
protected determineRole = async (from: ActorRef): Promise<[UserRole: AccessRole, UserID: Id, IsTemporaryAccount: boolean]> => {
if (systemEquals(this.actorRef!, from)) {
return ["SYSTEM", "SYSTEM" as Id];
return ["SYSTEM", "SYSTEM" as Id, false];
}
if (extractSystemName(this.actorRef!.name) === from.name.replace("actors://", "")) {
// It's our actor system that's asking directly
return ["SYSTEM", "SYSTEM" as Id];
return ["SYSTEM", "SYSTEM" as Id, false];
}

const session: Session = await this.ask(
Expand All @@ -55,9 +55,9 @@ export abstract class StoringActor<Entity extends Document & { updated: Timestam
.then(s => s as Session)
.catch((e: Error): Session => {
console.error(e);
return { role: "STUDENT", uid: "" } as Session;
return { role: "STUDENT", uid: "", fingerprint: "-"} as Session;
});
return [session.role, session.uid];
return [session.role, session.uid, !!session.fingerprint];
};

protected async afterEntityRemovedFromCache(_uid: Id) {
Expand Down
58 changes: 57 additions & 1 deletion packages/backend/src/actors/UserStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import { CollecionSubscription, SubscribableActor } from "./SubscribableActor";
import { AccessRole } from "./StoringActor";
import { maybe } from "tsmonads";
import { createActorUri } from "../utils";
import { DateTime } from "luxon";

const REMOVE_TEMPS_INTERVAL = 1; // 30; // 30 days

type ListedUser = Omit<User, "quizUsage">;

Expand Down Expand Up @@ -66,6 +69,25 @@ export class UserStore extends SubscribableActor<User, UserStoreMessage, ResultT
draft.teachers.set(user.uid, { uid: user.uid, username: user.username, nickname: user.nickname });
}

protected override cleanup(): void {
super.cleanup();
const cleanupTemps = async () => {
const cleanupTimestamp = toTimestamp(DateTime.utc().minus({ days: REMOVE_TEMPS_INTERVAL }));
const db = await this.connector.db()
const temporaryUsers = await db.collection<User>(this.collectionName).find({ isTemporary: true }).toArray();
temporaryUsers.forEach(user => {
if (user.lastLogin < cleanupTimestamp) {
this.logger.debug(`Deleting old temporary user ${user.uid} ${user.username}`);
db.collection<User>(this.collectionName).deleteOne({ uid: user.uid });
this.state.lastTouched.delete(user.uid);
this.state.cache.delete(user.uid);
this.afterEntityRemovedFromCache(user.uid);
}
})
}
cleanupTemps();
}

public async receive(from: ActorRef, message: UserStoreMessage): Promise<ResultType> {
console.log("USERSTORE", from.name, message);
try {
Expand Down Expand Up @@ -134,6 +156,19 @@ export class UserStore extends SubscribableActor<User, UserStoreMessage, ResultT
const maybeUser = await this.getEntity(userId);
return maybeUser.match<User | Error>(identity, () => new Error(`User id ${userId} does not exist`));
},
GetByFingerprint: async fp => {
if (!["ADMIN", "SYSTEM"].includes(clientUserRole)) {
return new Error(`Operation not allowed`);
}
const db = await this.connector.db();
const maybeUser = maybe(
await db.collection<User>(this.collectionName).findOne({ fingerprint: fp })
);
return maybeUser.match<User | Error>(
identity,
() => new Error(`User fingerprint ${fp} does not exist`)
);
},
GetAll: async () => {
if (!["ADMIN", "SYSTEM"].includes(clientUserRole)) {
return new Error(`Operation not allowed`);
Expand All @@ -142,7 +177,9 @@ export class UserStore extends SubscribableActor<User, UserStoreMessage, ResultT
const users = await db.collection<User>(this.collectionName).find({}).toArray();
users.forEach(user => {
const { _id, quizUsage, ...rest } = user;
this.send(from, new UserUpdateMessage(rest));
//if (clientUserRole === "SYSTEM" || !rest.isTemporary) {
this.send(from, new UserUpdateMessage(rest));
//}
});
return unit();
},
Expand Down Expand Up @@ -232,6 +269,25 @@ export class UserStore extends SubscribableActor<User, UserStoreMessage, ResultT
.toArray();
return users;
},
Remove: async uid => {
const db = await this.connector.db();
const mbUser = maybe(await db.collection<User>(this.collectionName).findOne({uid}));
return mbUser.match<Unit | Error>(
user => {
if (user.isTemporary) {
this.deleteEntity(user.uid);
this.state.lastTouched.delete(uid);
this.state.cache.delete(uid);
} else {
this.logger.warn(`Trying to remove non-temporary user ${uid}. Operation not allowed and therefore skipped.`);
}
return unit();
},
() => {
return new Error(`User not found with id <${uid}>`);
}
)
},
default: async () => {
return new Error(`Unknown message ${JSON.stringify(message)} from ${from.name}`);
},
Expand Down
5 changes: 4 additions & 1 deletion packages/backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ import multer from "@koa/multer";
import type { File } from "@koa/multer";
import type { IncomingMessage } from "http";
import koaLogger from "koa-logger-winston";
import { authLogin, authLogout, authProviderCallback, authRefresh } from "./middlewares/authRoutes";
import { authLogin, authLogout, authProviderCallback, authRefresh, authTempAccount } from "./middlewares/authRoutes";
import { errorHandler } from "./middlewares/errorHandler";
import { logger } from "./logger";
import { authenticationMiddleware } from "./middlewares/authMiddleware";
import { QuizActor } from "./actors/QuizActor";
import { ErrorActor } from "./actors/ErrorActor";
import { createReadStream, existsSync } from "fs";
import * as path from "path";
import { FingerprintStore } from "./actors/FingerprintStore";

const config = {
port: parseInt(process.env.SERVER_PORT ?? "3123"),
Expand Down Expand Up @@ -56,6 +57,7 @@ router
.get("/auth/callback", authProviderCallback)
.get("/auth/logout", authLogout)
.get("/auth/refresh", authRefresh)
.get("/auth/temp", authTempAccount)
.get("/ping", ctx => {
ctx.status = 200;
ctx.body = "PONG";
Expand Down Expand Up @@ -105,6 +107,7 @@ const start = async () => {
const system = await DistributedActorSystem.create({ distributor, systemName, logger });
Container.set("actor-system", system);
await system.createActor(SessionStore, { name: "SessionStore", strategy: "Restart" });
await system.createActor(FingerprintStore, { name: "FingerprintStore", strategy: "Restart" });
await system.createActor(UserStore, { name: "UserStore", strategy: "Restart" });
await system.createActor(QuizActor, { name: "QuizActor", strategy: "Restart" });
await system.createActor(ErrorActor, { name: "ErrorActor", strategy: "Restart", errorReceiver: true });
Expand Down
Loading