Skip to content

Commit 3805be8

Browse files
committed
head
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
1 parent ab83dd2 commit 3805be8

20 files changed

+1614
-26
lines changed

.vscode/launch.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,24 @@
155155
"request": "launch",
156156
"url": "http://localhost:8080",
157157
"webRoot": "${workspaceFolder}/apps/client"
158+
},
159+
160+
{
161+
"name": "Launch Server NestJS",
162+
"type": "node",
163+
"request": "launch",
164+
"runtimeExecutable": "pnpm",
165+
"runtimeArgs": [
166+
"run",
167+
"start:debug"
168+
],
169+
"cwd": "${workspaceFolder}/apps/server-nestjs",
170+
"console": "internalConsole",
171+
"restart": true,
172+
"skipFiles": [
173+
"<node_internals>/**",
174+
"${workspaceFolder}/node_modules/**/*.js"
175+
]
158176
}
159177
],
160178
"compounds": [

apps/server-nestjs/src/cpin-module/infrastructure/configuration/configuration.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export class ConfigurationService {
1919

2020
// keycloak
2121
sessionSecret = process.env.SESSION_SECRET
22+
keycloakUrl = process.env.KEYCLOAK_URL
2223
keycloakProtocol = process.env.KEYCLOAK_PROTOCOL
2324
keycloakDomain = process.env.KEYCLOAK_DOMAIN
2425
keycloakRealm = process.env.KEYCLOAK_REALM
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Controller, Get } from '@nestjs/common'
2+
import { Monitor, MonitorStatus } from '@cpn-console/shared'
3+
import type { MonitorInfos } from '@cpn-console/shared'
4+
import type { ConfigurationService } from '../../cpin-module/infrastructure/configuration/configuration.service'
5+
6+
@Controller('keycloak')
7+
export class KeycloakController {
8+
private monitor: Monitor
9+
10+
constructor(
11+
private readonly configService: ConfigurationService,
12+
) {
13+
this.monitor = new Monitor(async (instance): Promise<MonitorInfos> => {
14+
instance.lastStatus.lastUpdateTimestamp = Date.now()
15+
try {
16+
if (!this.configService.keycloakUrl) {
17+
throw new Error('keycloakUrl is not defined')
18+
}
19+
const res = await fetch(this.configService.keycloakUrl)
20+
if (res.status === 200) {
21+
instance.lastStatus.status = MonitorStatus.OK
22+
instance.lastStatus.message = MonitorStatus.OK
23+
return instance.lastStatus
24+
}
25+
instance.lastStatus.status = MonitorStatus.ERROR
26+
instance.lastStatus.message = 'Service en erreur'
27+
return instance.lastStatus
28+
} catch (error) {
29+
instance.lastStatus.message = 'Erreur lors la requête'
30+
instance.lastStatus.status = MonitorStatus.UNKNOW
31+
instance.lastStatus.cause = error
32+
}
33+
return instance.lastStatus
34+
})
35+
}
36+
37+
@Get('status')
38+
async status(): Promise<MonitorInfos> {
39+
return this.monitor.lastStatus
40+
}
41+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { ConfigurationService } from '@/cpin-module/infrastructure/configuration/configuration.service'
2+
import { Inject, Injectable } from '@nestjs/common'
3+
import axios from 'axios'
4+
import type { AxiosInstance } from 'axios'
5+
import { removeTrailingSlash } from './nexus.utils'
6+
7+
@Injectable()
8+
export class NexusClientService {
9+
readonly axios: AxiosInstance
10+
11+
constructor(
12+
@Inject(ConfigurationService) private readonly config: ConfigurationService,
13+
) {
14+
this.axios = axios.create({
15+
baseURL: `${removeTrailingSlash(this.config.nexusInternalUrl!)}/service/rest/v1/`,
16+
auth: {
17+
username: this.config.nexusAdmin!,
18+
password: this.config.nexusAdminPassword!,
19+
},
20+
headers: {
21+
Accept: 'application/json',
22+
},
23+
})
24+
}
25+
26+
async deleteIfExists(path: string) {
27+
return this.axios({
28+
method: 'delete',
29+
url: path,
30+
validateStatus: code => code === 404 || code < 300,
31+
})
32+
}
33+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Module } from '@nestjs/common'
2+
import { ConfigurationModule } from '@/cpin-module/infrastructure/configuration/configuration.module'
3+
import { InfrastructureModule } from '@/cpin-module/infrastructure/infrastructure.module'
4+
import { VaultModule } from '../vault/vault.module'
5+
import { NexusClientService } from './nexus-client.service'
6+
import { NexusService } from './nexus.service'
7+
8+
@Module({
9+
imports: [ConfigurationModule, InfrastructureModule, VaultModule],
10+
providers: [NexusService, NexusClientService],
11+
exports: [NexusService],
12+
})
13+
export class NexusModule {}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Test } from '@nestjs/testing'
2+
import type { TestingModule } from '@nestjs/testing'
3+
import { describe, it, expect, beforeEach } from 'vitest'
4+
import { mockDeep, mockReset } from 'vitest-mock-extended'
5+
import { NexusService } from './nexus.service'
6+
import { NexusClientService } from './nexus-client.service'
7+
import { VaultService } from '../vault/vault.service'
8+
import { ConfigurationService } from '@/cpin-module/infrastructure/configuration/configuration.service'
9+
10+
const nexusClientMock = mockDeep<NexusClientService>()
11+
const vaultMock = mockDeep<VaultService>()
12+
13+
function createNexusServiceTestingModule() {
14+
return Test.createTestingModule({
15+
providers: [
16+
NexusService,
17+
{
18+
provide: NexusClientService,
19+
useValue: nexusClientMock,
20+
},
21+
{
22+
provide: VaultService,
23+
useValue: vaultMock,
24+
},
25+
{
26+
provide: ConfigurationService,
27+
useValue: {
28+
nexusSecretExposedUrl: 'https://nexus.example',
29+
projectRootPath: 'forge',
30+
} satisfies Partial<ConfigurationService>,
31+
},
32+
],
33+
})
34+
}
35+
36+
describe('nexusService', () => {
37+
let service: NexusService
38+
39+
beforeEach(async () => {
40+
mockReset(nexusClientMock)
41+
mockReset(vaultMock)
42+
const module: TestingModule = await createNexusServiceTestingModule().compile()
43+
service = module.get(NexusService)
44+
})
45+
46+
it('should be defined', () => {
47+
expect(service).toBeDefined()
48+
})
49+
})

0 commit comments

Comments
 (0)