diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts index a1cf95f26fcd4fceca6266b1bc1f47e17d81e33e..d4e5330788ef9949fa85b535c4c2828df8933a15 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 90076ccab8763d8d1136e6a3c6f42d7e57ecb653..0b638a78ba511b1233a66baf4cde5b415d714633 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 fae56b7dcb5f84e5001a5bef1fce2b0e1164306d..f595c87d27d68cbf10c2639f1958b6a6c0b245c7 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 0000000000000000000000000000000000000000..90b1481e0d0a847d78d27f4c77481a357e043031 --- /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 46f75dd7403b2e67556fd5458ab656ab5b0069bf..9abad84f5038f6b7922d8b0bf3acacf36d4a1a86 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 2d6928893d12283da2731d41db7a7a20d1a919aa..cc6a654a827011a533ba80ff99d130e4a9360a1c 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 ef68935d76c628a47ace6b4891187050e8f2e32c..4d55ec933fc3048993ad10189adcbb03c80ed847 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); } }