diff --git a/js/api/ApiRequest.ts b/js/api/ApiRequest.ts index f016fc2..f7be1c3 100644 --- a/js/api/ApiRequest.ts +++ b/js/api/ApiRequest.ts @@ -8,7 +8,7 @@ export default class ApiRequest protected method: RequestMethod; protected url: string; protected parameters: Record = {}; - protected onSuccess: (responseText: string, status: number) => void; + protected onSuccess: (responseText: string) => void; protected onError: (responseText: string, status: number) => void; public constructor(url: string, method: RequestMethod) @@ -31,7 +31,7 @@ export default class ApiRequest this.request.onreadystatechange = () => { if (this.request.readyState === 4) { if (this.request.status === 200) { - this.onSuccess(this.request.responseText, this.request.status); + this.onSuccess(this.request.responseText); } else { this.onError(this.request.responseText, this.request.status); } @@ -42,7 +42,7 @@ export default class ApiRequest this.request.send(JSON.stringify(this.parameters)); } - public setOnSuccess(callback: (responseText: string, status: number) => void): void + public setOnSuccess(callback: (responseText: string) => void): void { this.onSuccess = callback; } diff --git a/js/api/FingerprintGetApiRequest.ts b/js/api/FingerprintGetApiRequest.ts new file mode 100644 index 0000000..622e98c --- /dev/null +++ b/js/api/FingerprintGetApiRequest.ts @@ -0,0 +1,19 @@ +import ApiRequest from "./ApiRequest.js"; +import RequestMethod from "./RequestMethod.js"; +import Fingerprint from "../types/Fingerprint.js"; +import FingerprintGetEvent from "../event/FingerprintGetEvent.js"; + +export default class FingerprintGetApiRequest extends ApiRequest +{ + public constructor(fingerprintId: number) { + super('fingerprint/' + fingerprintId, RequestMethod.GET); + + this.onSuccess = (response: string): void => { + let json = JSON.parse(response); + + let fingerprint = new Fingerprint(json.result.fingerprintId, json.result.fingerprint, json.result.userId); + + window.dispatchEvent(new FingerprintGetEvent(fingerprint)); + } + } +} \ No newline at end of file diff --git a/js/api/UserGetApiRequest.ts b/js/api/UserGetApiRequest.ts index 79a27be..a80ef00 100644 --- a/js/api/UserGetApiRequest.ts +++ b/js/api/UserGetApiRequest.ts @@ -1,10 +1,24 @@ import ApiRequest from "./ApiRequest.js"; import RequestMethod from "./RequestMethod.js"; +import UserGetEvent from "../event/UserGetEvent.js"; +import User from "../types/User.js"; export default class UserGetApiRequest extends ApiRequest { public constructor(userId: number) { super('user/' + userId, RequestMethod.GET); + + this.onSuccess = (response: string) => { + let json = JSON.parse(response); + + let user = new User(json.result.userId); + user.setUsername(json.result.username); + user.setJabberAddress(json.result.jabberAddress); + user.setAdmin(json.result.isAdmin); + user.setFingerprintIds(json.result.fingerprintIds); + + window.dispatchEvent(new UserGetEvent(user)); + } } } diff --git a/js/api/UserLoginApiRequest.ts b/js/api/UserLoginApiRequest.ts new file mode 100644 index 0000000..62ede11 --- /dev/null +++ b/js/api/UserLoginApiRequest.ts @@ -0,0 +1,20 @@ +import ApiRequest from "./ApiRequest.js"; +import RequestMethod from "./RequestMethod.js"; +import UserLoginSuccessEvent from "../event/UserLoginSuccessEvent.js"; + +export default class UserLoginApiRequest extends ApiRequest +{ + public constructor(username: string, password: string) + { + super('user/session', RequestMethod.POST); + + this.addParameter('username', username); + this.addParameter('password', password); + + this.onSuccess = (response: string) => + { + let json = JSON.parse(response); + window.dispatchEvent(new UserLoginSuccessEvent(json.userId)); + }; + } +} \ No newline at end of file diff --git a/js/api/UserLogoutApiRequest.ts b/js/api/UserLogoutApiRequest.ts new file mode 100644 index 0000000..bc8ee11 --- /dev/null +++ b/js/api/UserLogoutApiRequest.ts @@ -0,0 +1,9 @@ +import ApiRequest from "./ApiRequest.js"; +import RequestMethod from "./RequestMethod.js"; + +export default class UserLogoutApiRequest extends ApiRequest +{ + public constructor() { + super('user/session', RequestMethod.DELETE); + } +} diff --git a/js/event/FingerprintGetEvent.ts b/js/event/FingerprintGetEvent.ts new file mode 100644 index 0000000..ebf4379 --- /dev/null +++ b/js/event/FingerprintGetEvent.ts @@ -0,0 +1,20 @@ +import RingfingerEvent from "./RingfingerEvent.js"; +import Fingerprint from "../types/Fingerprint.js"; + +export default class FingerprintGetEvent extends RingfingerEvent +{ + public static readonly NAME: string = 'fingerprintgetevent'; + + private fingerprint: Fingerprint; + + public constructor(fingerprint: Fingerprint) { + super(FingerprintGetEvent.NAME); + + this.fingerprint = fingerprint; + } + + public getFingerprint(): Fingerprint + { + return this.fingerprint; + } +} \ No newline at end of file diff --git a/js/event/RingfingerEvent.ts b/js/event/RingfingerEvent.ts new file mode 100644 index 0000000..0839ba5 --- /dev/null +++ b/js/event/RingfingerEvent.ts @@ -0,0 +1,4 @@ +export default class RingfingerEvent extends Event +{ + public static readonly NAME: string; +} \ No newline at end of file diff --git a/js/event/UserGetEvent.ts b/js/event/UserGetEvent.ts new file mode 100644 index 0000000..c709c4c --- /dev/null +++ b/js/event/UserGetEvent.ts @@ -0,0 +1,21 @@ +import RingfingerEvent from "./RingfingerEvent.js"; +import User from "../types/User.js"; + +export default class UserGetEvent extends RingfingerEvent +{ + public static readonly NAME: string = 'usergetevent'; + + private user: User; + + public constructor(user: User) + { + super(UserGetEvent.NAME); + + this.user = user; + } + + public getUser(): User + { + return this.user; + } +} \ No newline at end of file diff --git a/js/event/UserLoginSuccessEvent.ts b/js/event/UserLoginSuccessEvent.ts new file mode 100644 index 0000000..b10a38a --- /dev/null +++ b/js/event/UserLoginSuccessEvent.ts @@ -0,0 +1,19 @@ +import RingfingerEvent from "./RingfingerEvent.js"; + +export default class UserLoginSuccessEvent extends RingfingerEvent +{ + public static readonly NAME: string = 'userloginsuccessevent'; + + private userId: number; + + public constructor(userId: number) { + super(UserLoginSuccessEvent.NAME); + + this.userId = userId; + } + + public getUserId(): number + { + return this.userId; + } +} diff --git a/js/types/Fingerprint.ts b/js/types/Fingerprint.ts new file mode 100644 index 0000000..f451f2e --- /dev/null +++ b/js/types/Fingerprint.ts @@ -0,0 +1,49 @@ +export default class Fingerprint +{ + private static readonly CHARS_ALLOWED: string = '1234567890abcdef'; + + private readonly fingerprintId: number; + private readonly fingerprint: string; + private readonly userId: number; + + public constructor(fingerprintId: number, fingerprint: string, userId: number) + { + if (!Fingerprint.validateFingerprint(fingerprint)) { + throw new Error(fingerprint + ' is not a valid fingerprint!'); + } + + this.fingerprintId = fingerprintId; + this.fingerprint = fingerprint; + this.userId = userId; + } + + public getFingerprint(): string + { + return this.fingerprint; + } + + public getUserId(): number + { + return this.userId; + } + + public getFingerprintId(): number + { + return this.fingerprintId; + } + + private static validateFingerprint(fingerprint: string): boolean + { + if (fingerprint.length !== 64) { + return false; + } + + for (let i: number = 0; i < fingerprint.length; ++i) { + if (Fingerprint.CHARS_ALLOWED.indexOf(fingerprint[i]) === -1) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/js/types/User.ts b/js/types/User.ts new file mode 100644 index 0000000..38c79cf --- /dev/null +++ b/js/types/User.ts @@ -0,0 +1,53 @@ +export default class User +{ + private userId: number; + private username: string = ''; + private jabberAddress: string = ''; + private admin: boolean = false; + private fingerprintIds: Array = []; + + public constructor(userId: number) + { + this.userId = userId; + } + + public setUsername(username: string): void + { + this.username = username; + } + + public getUsername(): string + { + return this.username; + } + + public setJabberAddress(jabberAddress: string): void + { + this.jabberAddress = jabberAddress; + } + + public getJabberAddress(): string + { + return this.jabberAddress; + } + + public setAdmin(isAdmin: boolean): void + { + this.admin = isAdmin; + } + + public isAdmin(): boolean + { + return this.admin; + } + + public setFingerprintIds(fingerprintIds: Array) + { + this.fingerprintIds = fingerprintIds; + } + + public getFingerprintIds(): Array + { + return this.fingerprintIds; + } +} \ No newline at end of file