import SystemId from 'system/enum/id'; import HttpHeader from 'http/enum/header'; import AccountNode from 'type/node/account'; import SessionNode from 'type/node/session'; import buildCookie from 'http/utility/build-cookie'; import HtmlEndpoint from 'endpoint/html'; import TimeInterval from 'enum/time-interval'; import KeyGenerator from 'utility/key-generator'; import getNodeParameters from 'utility/get-node-parameters'; import FetchAccountOperation from 'operation/fetch-account'; import CreateInstanceOperation from 'operation/create-instance'; interface Input { readonly username: string; readonly password: string; } class HtmlCreateSessionEndpoint extends HtmlEndpoint { protected async process(): Promise { const account = await this.fetchAccount(); const session = await this.createSession(account); this.setCookieFromSession(session); this.redirectToUrl('/'); } private async fetchAccount(): Promise { const repository = this.getRepository(); const account = await repository.fetchSystemAccount(); const credentials = { username: this.getUsername(), password: this.getPassword() }; const input = { credentials, repository, account }; const operation = new FetchAccountOperation(input); return operation.perform(); } private async createSession(account: AccountNode): Promise { const id = KeyGenerator.id(); const type_id = SystemId.SESSION_TYPE; const node_parameters = { type_id, id }; const fields = [ { key: 'account', value: account.url } ]; const repository = this.getRepository(); const system_account = await repository.fetchSystemAccount(); const input = { node_parameters, fields, repository, account: system_account }; const operation = new CreateInstanceOperation(input); const node = await operation.perform(); return node as SessionNode; } private setCookieFromSession(session: SessionNode): void { const session_parameters = getNodeParameters(session.url); const cookie = buildCookie(session_parameters.id, TimeInterval.ONE_DAY); this.setHeaderValue(HttpHeader.SET_COOKIE, cookie); } private getUsername(): string { const request_body = this.getRequestBody(); return request_body.username; } private getPassword(): string { const request_body = this.getRequestBody(); return request_body.password; } } export default HtmlCreateSessionEndpoint;