From 6be5dd8e7f8dfc29e1efd830a1ccec12017d9f77 Mon Sep 17 00:00:00 2001 From: Mario HOTAJ <mhotaj@takima.fr> Date: Thu, 30 Jun 2022 15:34:52 +0000 Subject: [PATCH] feat: ping update work time --- .../src/core/api.service.ts | 21 +++++++++++++++++-- .../deadlock-extension/src/core/controller.ts | 8 +++++-- .../src/core/mission/missionDevContainer.ts | 1 + .../src/core/mission/models/missionUser.ts | 12 +++++++++++ .../src/core/mission/models/userChallenge.ts | 1 + .../deadlock-extension/src/core/userConfig.ts | 9 ++++---- .../deadlock-extension/src/extension.ts | 14 +++++++++++++ 7 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 deadlock-plugins/deadlock-extension/src/core/mission/models/missionUser.ts diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts index a1cf95f2..d4e53307 100644 --- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts +++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts @@ -6,6 +6,7 @@ import { extensionError as error } from '../recorder/utils/log'; import Controller from './controller'; import ExtensionStore from './extensionStore'; import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection'; +import { MissionUser } from './mission/models/missionUser'; import { User } from './mission/models/userChallenge'; export default class ApiService { @@ -129,9 +130,25 @@ export default class ApiService { return this.axiosInstance.get<User>(`users/${userId}`).then((res) => res.data); } - async grantAccessToRepository(userId: string, missionId: string): Promise<any> { + async grantAccessToRepository(userId: string, missionId: string): Promise<number> { return this.axiosInstance - .get<any>(`users/${userId}/missions/${missionId}/repositoryAccess`) + .post<MissionUser>(`users/${userId}/missions/${missionId}/repository/collaborator`) + .then((res) => res.status); + } + + async pingUpdateWorkTime(userId: string, missionId: string): Promise<MissionUser> { + return this.axiosInstance + .post<MissionUser>(`users/${userId}/missions/${missionId}/worktime`, { + action: 'PING', + }) + .then((res) => res.data); + } + + async startUpdateWorkTime(userId: string, missionId: string): Promise<MissionUser> { + return this.axiosInstance + .post<MissionUser>(`users/${userId}/missions/${missionId}/worktime`, { + action: 'START', + }) .then((res) => res.data); } } diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 90076cca..0b638a78 100644 --- a/deadlock-plugins/deadlock-extension/src/core/controller.ts +++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts @@ -23,7 +23,7 @@ export default class Controller { private briefingView: BriefingView; private quickSetupView: QuickSetupView; private extensionStore: ExtensionStore; - private apiService: ApiService; + private _apiService: ApiService; private constructor(context: ExtensionContext) { this.extensionStore = ExtensionStore.getInstance(context); @@ -36,7 +36,7 @@ export default class Controller { KEYCLOAK_USER_INFO_URL, ); - this.apiService = new ApiService(this.connection, this.extensionStore, this); + this._apiService = new ApiService(this.connection, this.extensionStore, this); this.init(); } @@ -48,6 +48,10 @@ export default class Controller { return Controller.instance; } + public get apiService(): ApiService { + return this._apiService; + } + private async init() { const that = this; window.registerUriHandler({ diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts index fae56b7d..f595c87d 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts @@ -88,6 +88,7 @@ export class MissionDevContainer { missionVersion: this.mission.version, remoteGitUsername: this.user.id.split('-').join(''), currentUserDetails: this.currentUser.details, + currentUserId: this.currentUser.id, remoteUserDetails: this.user.details, }; return JSON.stringify(userChallengeJson, null, 2); diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/models/missionUser.ts b/deadlock-plugins/deadlock-extension/src/core/mission/models/missionUser.ts new file mode 100644 index 00000000..90b1481e --- /dev/null +++ b/deadlock-plugins/deadlock-extension/src/core/mission/models/missionUser.ts @@ -0,0 +1,12 @@ +export interface MissionUser { + startDate: number; + lastWorkTimeUpdate: number; + workTime: number; + bestScore: number; + started: boolean; + solved: boolean; + idle: boolean; + mission: string; + user: string; + status: string; +} diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/models/userChallenge.ts b/deadlock-plugins/deadlock-extension/src/core/mission/models/userChallenge.ts index 46f75dd7..9abad84f 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/models/userChallenge.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/models/userChallenge.ts @@ -2,6 +2,7 @@ interface UserChallenge { giteaHost: string; giteaSshPort: number; username: string; + currentUserId: string; email: string; missionId: string; missionVersion: string; diff --git a/deadlock-plugins/deadlock-extension/src/core/userConfig.ts b/deadlock-plugins/deadlock-extension/src/core/userConfig.ts index 2d692889..cc6a654a 100644 --- a/deadlock-plugins/deadlock-extension/src/core/userConfig.ts +++ b/deadlock-plugins/deadlock-extension/src/core/userConfig.ts @@ -27,11 +27,6 @@ export default abstract class UserConfig { getHost(): string { return this.userConfigJson?.host; } - - getToken(): string { - return this.userConfigJson?.token; - } - getGiteaHost(): string { return this.userConfigJson?.giteaHost; } @@ -68,6 +63,10 @@ export default abstract class UserConfig { return this.userConfigJson?.remoteUserDetails; } + getCurrentUserId(): string { + return this.userConfigJson?.currentUserId; + } + abstract loadText(): Promise<string>; public async init() { diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts index ef68935d..4d55ec93 100644 --- a/deadlock-plugins/deadlock-extension/src/extension.ts +++ b/deadlock-plugins/deadlock-extension/src/extension.ts @@ -11,6 +11,19 @@ import StartedMissionsView from './view/startedMissionsView'; // TODO: refactor remove this export const userConfig = new UserConfigTheia(); +export async function runTimer(userId: string, missionId: string, context: ExtensionContext) { + const apiService = Controller.getInstance(context).apiService; + try { + await apiService.startUpdateWorkTime(userId, missionId); + setInterval(async () => { + await apiService.pingUpdateWorkTime(userId, missionId); + }, 60000); // 1 minute + } catch (e) { + window.showErrorMessage(`Erreur lors de l'enregistrement du temps de travail`); + error(JSON.stringify(e)); + } +} + export async function activate(context: ExtensionContext) { window.showInformationMessage('Bienvenue sur Deadlock!'); Controller.getInstance(context); @@ -35,5 +48,6 @@ export async function activate(context: ExtensionContext) { } if (isDocker()) { Recorder.instance.run(); + runTimer(userConfig.getCurrentUserId(), userConfig.getMissionId(), context); } } -- GitLab