@into-cps-association/libms 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +0 -3
- package/DEVELOPER.md +24 -7
- package/README.md +42 -43
- package/config/.env.default +6 -0
- package/config/http.json +30 -0
- package/dist/src/bootstrap.d.ts +1 -0
- package/dist/src/bootstrap.js +4 -0
- package/dist/src/bootstrap.js.map +1 -1
- package/dist/src/cloudcmd/cloudcmd.d.ts +3 -0
- package/dist/src/cloudcmd/cloudcmd.js +22 -0
- package/dist/src/cloudcmd/cloudcmd.js.map +1 -0
- package/dist/src/files/files.module.js +1 -7
- package/dist/src/files/files.module.js.map +1 -1
- package/dist/src/files/services/files-service.factory.d.ts +1 -3
- package/dist/src/files/services/files-service.factory.js +2 -10
- package/dist/src/files/services/files-service.factory.js.map +1 -1
- package/dist/src/files/services/local-files.service.js +2 -2
- package/dist/src/main.js +8 -8
- package/dist/src/main.js.map +1 -1
- package/dist/test/cloudcmd/cloudcmd.spec.js +35 -0
- package/dist/test/cloudcmd/cloudcmd.spec.js.map +1 -0
- package/dist/test/e2e/app.e2e.spec.js +27 -10
- package/dist/test/e2e/app.e2e.spec.js.map +1 -1
- package/dist/test/integration/files.service.integration.spec.js +1 -3
- package/dist/test/integration/files.service.integration.spec.js.map +1 -1
- package/dist/test/testUtil.js +1 -10
- package/dist/test/testUtil.js.map +1 -1
- package/dist/test/unit/files-service.factory.unit.spec.js +0 -8
- package/dist/test/unit/files-service.factory.unit.spec.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +37 -27
- package/pm2.config.js +10 -0
- package/src/bootstrap.ts +8 -0
- package/src/cloudcmd/cloudcmd.ts +32 -0
- package/src/files/files.module.ts +1 -7
- package/src/files/services/files-service.factory.ts +0 -5
- package/src/files/services/local-files.service.ts +2 -2
- package/src/main.ts +12 -7
- package/test/cloudcmd/cloudcmd.spec.ts +52 -0
- package/test/coverage/clover.xml +14 -19
- package/test/coverage/coverage-final.json +1 -1
- package/test/coverage/lcov-report/base.css +261 -123
- package/test/coverage/lcov-report/index.html +13 -13
- package/test/coverage/lcov-report/prettify.css +101 -1
- package/test/coverage/lcov-report/testUtil.ts.html +8 -35
- package/test/coverage/lcov.info +10 -19
- package/test/e2e/app.e2e.spec.ts +42 -42
- package/test/integration/files.service.integration.spec.ts +1 -3
- package/test/testUtil.ts +1 -10
- package/test/unit/files-service.factory.unit.spec.ts +0 -9
- package/tsconfig.json +1 -1
- package/dist/src/files/queries.d.ts +0 -2
- package/dist/src/files/queries.js +0 -47
- package/dist/src/files/queries.js.map +0 -1
- package/dist/src/files/services/gitlab-files.service.d.ts +0 -12
- package/dist/src/files/services/gitlab-files.service.js +0 -65
- package/dist/src/files/services/gitlab-files.service.js.map +0 -1
- package/dist/test/unit/gitlab-files.service.unit.spec.js +0 -37
- package/dist/test/unit/gitlab-files.service.unit.spec.js.map +0 -1
- package/src/files/queries.ts +0 -42
- package/src/files/services/gitlab-files.service.ts +0 -65
- package/test/starttraefik.bash +0 -11
- package/test/stoptraefik.bash +0 -9
- package/test/unit/gitlab-files.service.unit.spec.ts +0 -46
- /package/dist/test/{unit/gitlab-files.service.unit.spec.d.ts → cloudcmd/cloudcmd.spec.d.ts} +0 -0
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">69.23% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>18/
|
|
28
|
+
<span class='fraction'>18/26</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">0% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>0/
|
|
35
|
+
<span class='fraction'>0/4</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">69.23% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>18/
|
|
49
|
+
<span class='fraction'>18/26</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -244,16 +244,7 @@
|
|
|
244
244
|
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
245
|
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
246
|
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
257
248
|
<span class="cline-any cline-yes">1x</span>
|
|
258
249
|
<span class="cline-any cline-neutral"> </span>
|
|
259
250
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -316,15 +307,6 @@
|
|
|
316
307
|
<span class="cline-any cline-no"> </span>
|
|
317
308
|
<span class="cline-any cline-neutral"> </span>
|
|
318
309
|
<span class="cline-any cline-no"> </span>
|
|
319
|
-
<span class="cline-any cline-neutral"> </span>
|
|
320
|
-
<span class="cline-any cline-no"> </span>
|
|
321
|
-
<span class="cline-any cline-neutral"> </span>
|
|
322
|
-
<span class="cline-any cline-no"> </span>
|
|
323
|
-
<span class="cline-any cline-neutral"> </span>
|
|
324
|
-
<span class="cline-any cline-no"> </span>
|
|
325
|
-
<span class="cline-any cline-no"> </span>
|
|
326
|
-
<span class="cline-any cline-neutral"> </span>
|
|
327
|
-
<span class="cline-any cline-no"> </span>
|
|
328
310
|
<span class="cline-any cline-no"> </span>
|
|
329
311
|
<span class="cline-any cline-neutral"> </span>
|
|
330
312
|
<span class="cline-any cline-no"> </span>
|
|
@@ -502,18 +484,9 @@ export class MockConfigService {
|
|
|
502
484
|
// eslint-disable-next-line class-methods-use-this
|
|
503
485
|
<span class="fstat-no" title="function not covered" > get(</span>key: string): string {
|
|
504
486
|
<span class="cstat-no" title="statement not covered" > switch (key) {</span>
|
|
505
|
-
case 'TOKEN':
|
|
506
|
-
<span class="cstat-no" title="statement not covered" > return process.env.TOKEN;</span>
|
|
507
487
|
case 'LOCAL_PATH':
|
|
508
|
-
<span class="cstat-no" title="statement not covered" > return process.env.
|
|
509
|
-
case 'GITLAB_URL':
|
|
510
|
-
<span class="cstat-no" title="statement not covered" > return process.env.GITLAB_URL;</span>
|
|
511
|
-
case 'GITLAB_GROUP':
|
|
512
|
-
<span class="cstat-no" title="statement not covered" > return 'dtaas';</span>
|
|
488
|
+
<span class="cstat-no" title="statement not covered" > return process.env.LOCAL_PATH;</span>
|
|
513
489
|
case 'MODE':
|
|
514
|
-
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (process.env.MODE === 'gitlab') {</span>
|
|
515
|
-
<span class="cstat-no" title="statement not covered" > return 'gitlab';</span>
|
|
516
|
-
}
|
|
517
490
|
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (process.env.MODE === 'local') {</span>
|
|
518
491
|
<span class="cstat-no" title="statement not covered" > return 'local';</span>
|
|
519
492
|
}
|
|
@@ -640,7 +613,7 @@ export const e2eReadFile = `query {
|
|
|
640
613
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
641
614
|
Code coverage generated by
|
|
642
615
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
643
|
-
at 2024-01-
|
|
616
|
+
at 2024-01-24T15:14:58.796Z
|
|
644
617
|
</div>
|
|
645
618
|
<script src="prettify.js"></script>
|
|
646
619
|
<script>
|
package/test/coverage/lcov.info
CHANGED
|
@@ -24,29 +24,20 @@ DA:56,1
|
|
|
24
24
|
DA:59,0
|
|
25
25
|
DA:61,0
|
|
26
26
|
DA:63,0
|
|
27
|
-
DA:
|
|
28
|
-
DA:
|
|
27
|
+
DA:64,0
|
|
28
|
+
DA:66,0
|
|
29
29
|
DA:69,0
|
|
30
|
-
DA:
|
|
31
|
-
DA:
|
|
32
|
-
DA:
|
|
33
|
-
DA:
|
|
34
|
-
DA:
|
|
35
|
-
|
|
36
|
-
DA:102,1
|
|
37
|
-
DA:142,1
|
|
38
|
-
DA:160,1
|
|
39
|
-
DA:178,1
|
|
40
|
-
LF:31
|
|
30
|
+
DA:74,1
|
|
31
|
+
DA:93,1
|
|
32
|
+
DA:133,1
|
|
33
|
+
DA:151,1
|
|
34
|
+
DA:169,1
|
|
35
|
+
LF:26
|
|
41
36
|
LH:18
|
|
42
37
|
BRDA:59,0,0,0
|
|
43
38
|
BRDA:59,0,1,0
|
|
44
39
|
BRDA:59,0,2,0
|
|
45
|
-
BRDA:
|
|
46
|
-
|
|
47
|
-
BRDA:59,0,5,0
|
|
48
|
-
BRDA:69,1,0,0
|
|
49
|
-
BRDA:72,2,0,0
|
|
50
|
-
BRF:8
|
|
40
|
+
BRDA:63,1,0,0
|
|
41
|
+
BRF:4
|
|
51
42
|
BRH:0
|
|
52
43
|
end_of_record
|
package/test/e2e/app.e2e.spec.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
2
|
import { INestApplication } from '@nestjs/common';
|
|
3
3
|
import * as request from 'supertest';
|
|
4
|
-
|
|
4
|
+
import fetch from 'cross-fetch';
|
|
5
|
+
import {
|
|
6
|
+
ApolloClient,
|
|
7
|
+
DocumentNode,
|
|
8
|
+
HttpLink,
|
|
9
|
+
InMemoryCache,
|
|
10
|
+
gql,
|
|
11
|
+
} from '@apollo/client';
|
|
5
12
|
import AppModule from '../../src/app.module';
|
|
6
13
|
import {
|
|
7
14
|
e2eReadFile,
|
|
@@ -10,12 +17,18 @@ import {
|
|
|
10
17
|
expectedListDirectoryResponse,
|
|
11
18
|
} from '../testUtil';
|
|
12
19
|
|
|
20
|
+
const client = new ApolloClient({
|
|
21
|
+
link: new HttpLink({
|
|
22
|
+
uri: `http://localhost:${process.env.PORT}${process.env.APOLLO_PATH}`,
|
|
23
|
+
fetch,
|
|
24
|
+
}),
|
|
25
|
+
cache: new InMemoryCache({ addTypename: false }),
|
|
26
|
+
});
|
|
27
|
+
|
|
13
28
|
describe('End to End test for the application', () => {
|
|
14
29
|
let app: INestApplication;
|
|
15
30
|
|
|
16
31
|
beforeAll(async () => {
|
|
17
|
-
// execSync("test/starttraefik.bash");
|
|
18
|
-
|
|
19
32
|
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
20
33
|
imports: [AppModule],
|
|
21
34
|
}).compile();
|
|
@@ -28,52 +41,39 @@ describe('End to End test for the application', () => {
|
|
|
28
41
|
}, 10000);
|
|
29
42
|
|
|
30
43
|
afterAll(async () => {
|
|
31
|
-
// execSync("test/stoptraefik.bash");
|
|
32
44
|
await app.close();
|
|
33
45
|
}, 10000);
|
|
34
46
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
47
|
+
async function HTTPQuery(
|
|
48
|
+
query: string,
|
|
49
|
+
expectedResponse: unknown,
|
|
50
|
+
): Promise<void> {
|
|
51
|
+
const response = await request(`http://localhost:${process.env.PORT}`)
|
|
39
52
|
.post(process.env.APOLLO_PATH)
|
|
40
53
|
.send({ query });
|
|
41
|
-
expect(response.body).toEqual(
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
it('should return the content of a file given in the query ', async () => {
|
|
45
|
-
const query = e2eReadFile;
|
|
54
|
+
expect(response.body).toEqual(expectedResponse);
|
|
55
|
+
}
|
|
46
56
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
async function GraphQLQuery(
|
|
58
|
+
query: DocumentNode,
|
|
59
|
+
expectedResponse: unknown,
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
const { data } = await client.query({ query });
|
|
62
|
+
expect({ data }).toEqual(expectedResponse);
|
|
63
|
+
}
|
|
64
|
+
it('should return the directory contents requested with HTTP POST query', async () => {
|
|
65
|
+
await HTTPQuery(e2elistDirectory, expectedListDirectoryResponse);
|
|
51
66
|
}, 10000);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/*
|
|
55
|
-
describe("End to End test for the application", () => {
|
|
56
|
-
it("should return the filename corresponding to the directory given in the query through the Traefik gateway", async () => {
|
|
57
|
-
const query = e2elistDirectory;
|
|
58
|
-
|
|
59
|
-
const response = await request("http://localhost")
|
|
60
|
-
.post("/lib")
|
|
61
|
-
.send({ query });
|
|
62
|
-
|
|
63
|
-
response;
|
|
64
|
-
expect(response.body).toEqual(expectedListDirectoryResponse);
|
|
65
|
-
}, 10000);
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
it('should return the file content requested with HTTP POST query', async () => {
|
|
69
|
+
await HTTPQuery(e2eReadFile, expectedFileContentResponse);
|
|
70
|
+
}, 10000);
|
|
69
71
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
it('should return the directory contents requested with GraphQL query', async () => {
|
|
73
|
+
await GraphQLQuery(gql(e2elistDirectory), expectedListDirectoryResponse);
|
|
74
|
+
}, 10000);
|
|
73
75
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
*/
|
|
76
|
+
it('should return the file content requested with GraphQL query', async () => {
|
|
77
|
+
await GraphQLQuery(gql(e2eReadFile), expectedFileContentResponse);
|
|
78
|
+
}, 10000);
|
|
79
|
+
});
|
|
@@ -3,7 +3,6 @@ import { ConfigService } from '@nestjs/config';
|
|
|
3
3
|
import FilesResolver from '../../src/files/resolvers/files.resolver';
|
|
4
4
|
import FilesServiceFactory from '../../src/files/services/files-service.factory';
|
|
5
5
|
import LocalFilesService from '../../src/files/services/local-files.service';
|
|
6
|
-
import GitlabFilesService from '../../src/files/services/gitlab-files.service';
|
|
7
6
|
import {
|
|
8
7
|
pathToTestDirectory,
|
|
9
8
|
pathToTestFileContent,
|
|
@@ -23,7 +22,6 @@ describe('Integration tests for FilesResolver', () => {
|
|
|
23
22
|
FilesResolver,
|
|
24
23
|
FilesServiceFactory,
|
|
25
24
|
LocalFilesService,
|
|
26
|
-
GitlabFilesService,
|
|
27
25
|
{ provide: ConfigService, useClass: MockConfigService },
|
|
28
26
|
],
|
|
29
27
|
}).compile();
|
|
@@ -35,7 +33,7 @@ describe('Integration tests for FilesResolver', () => {
|
|
|
35
33
|
jest.clearAllMocks();
|
|
36
34
|
});
|
|
37
35
|
|
|
38
|
-
const modes = ['local'
|
|
36
|
+
const modes = ['local'];
|
|
39
37
|
|
|
40
38
|
// eslint-disable-next-line no-restricted-syntax
|
|
41
39
|
for (const mode of modes) {
|
package/test/testUtil.ts
CHANGED
|
@@ -57,18 +57,9 @@ export class MockConfigService {
|
|
|
57
57
|
// eslint-disable-next-line class-methods-use-this
|
|
58
58
|
get(key: string): string {
|
|
59
59
|
switch (key) {
|
|
60
|
-
case 'TOKEN':
|
|
61
|
-
return process.env.TOKEN;
|
|
62
60
|
case 'LOCAL_PATH':
|
|
63
|
-
return process.env.
|
|
64
|
-
case 'GITLAB_URL':
|
|
65
|
-
return process.env.GITLAB_URL;
|
|
66
|
-
case 'GITLAB_GROUP':
|
|
67
|
-
return 'dtaas';
|
|
61
|
+
return process.env.LOCAL_PATH;
|
|
68
62
|
case 'MODE':
|
|
69
|
-
if (process.env.MODE === 'gitlab') {
|
|
70
|
-
return 'gitlab';
|
|
71
|
-
}
|
|
72
63
|
if (process.env.MODE === 'local') {
|
|
73
64
|
return 'local';
|
|
74
65
|
}
|
|
@@ -3,25 +3,21 @@ import { Test, TestingModule } from '@nestjs/testing';
|
|
|
3
3
|
import { ConfigService } from '@nestjs/config';
|
|
4
4
|
import FilesServiceFactory from '../../src/files/services/files-service.factory';
|
|
5
5
|
import LocalFilesService from '../../src/files/services/local-files.service';
|
|
6
|
-
import GitlabFilesService from '../../src/files/services/gitlab-files.service';
|
|
7
6
|
import { IFilesService } from '../../src/files/interfaces/files.service.interface';
|
|
8
7
|
|
|
9
8
|
describe('FilesServiceFactory', () => {
|
|
10
9
|
let serviceFactory: FilesServiceFactory;
|
|
11
10
|
let configService: ConfigService;
|
|
12
11
|
let localFilesService: IFilesService;
|
|
13
|
-
let gitlabFilesService: IFilesService;
|
|
14
12
|
|
|
15
13
|
beforeEach(async () => {
|
|
16
14
|
localFilesService = new LocalFilesService(configService as ConfigService);
|
|
17
|
-
gitlabFilesService = new GitlabFilesService(configService as ConfigService);
|
|
18
15
|
|
|
19
16
|
const module: TestingModule = await Test.createTestingModule({
|
|
20
17
|
providers: [
|
|
21
18
|
FilesServiceFactory,
|
|
22
19
|
{ provide: ConfigService, useValue: { get: jest.fn() } },
|
|
23
20
|
{ provide: LocalFilesService, useValue: localFilesService },
|
|
24
|
-
{ provide: GitlabFilesService, useValue: gitlabFilesService },
|
|
25
21
|
],
|
|
26
22
|
}).compile();
|
|
27
23
|
|
|
@@ -34,11 +30,6 @@ describe('FilesServiceFactory', () => {
|
|
|
34
30
|
expect(serviceFactory.create()).toBe(localFilesService);
|
|
35
31
|
});
|
|
36
32
|
|
|
37
|
-
it('should create a gitlab files service when MODE is gitlab', () => {
|
|
38
|
-
jest.spyOn(configService, 'get').mockReturnValue('gitlab');
|
|
39
|
-
expect(serviceFactory.create()).toBe(gitlabFilesService);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
33
|
it('should throw an error when MODE is invalid', () => {
|
|
43
34
|
jest.spyOn(configService, 'get').mockReturnValue('invalid');
|
|
44
35
|
expect(() => serviceFactory.create()).toThrowError(`Invalid MODE: invalid`);
|
package/tsconfig.json
CHANGED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getReadFileQuery = exports.getDirectoryQuery = void 0;
|
|
4
|
-
const getDirectoryQuery = (domain, parsedPath) => `
|
|
5
|
-
query listDirectory {
|
|
6
|
-
project(fullPath: "${domain}") {
|
|
7
|
-
repository {
|
|
8
|
-
tree(path: "${parsedPath}", recursive: false) {
|
|
9
|
-
blobs {
|
|
10
|
-
edges {
|
|
11
|
-
node {
|
|
12
|
-
name
|
|
13
|
-
type
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
trees {
|
|
18
|
-
edges {
|
|
19
|
-
node {
|
|
20
|
-
name
|
|
21
|
-
type
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
`;
|
|
30
|
-
exports.getDirectoryQuery = getDirectoryQuery;
|
|
31
|
-
const getReadFileQuery = (domain, parsedPath) => `
|
|
32
|
-
query readFile {
|
|
33
|
-
project(fullPath: "${domain}") {
|
|
34
|
-
repository {
|
|
35
|
-
blobs(paths: "${parsedPath}") {
|
|
36
|
-
nodes {
|
|
37
|
-
name
|
|
38
|
-
rawBlob
|
|
39
|
-
rawTextBlob
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
`;
|
|
46
|
-
exports.getReadFileQuery = getReadFileQuery;
|
|
47
|
-
//# sourceMappingURL=queries.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/files/queries.ts"],"names":[],"mappings":";;;AAAO,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAE,EAAE,CAAC;;yBAEhD,MAAM;;sBAET,UAAU;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;AAzBW,QAAA,iBAAiB,qBAyB5B;AAEK,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAE,EAAE,CAAC;;yBAE/C,MAAM;;wBAEP,UAAU;;;;;;;;;;CAUjC,CAAC;AAdW,QAAA,gBAAgB,oBAc3B"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ConfigService } from '@nestjs/config';
|
|
2
|
-
import { Project } from 'src/types';
|
|
3
|
-
import { IFilesService } from '../interfaces/files.service.interface';
|
|
4
|
-
export default class GitlabFilesService implements IFilesService {
|
|
5
|
-
private configService;
|
|
6
|
-
constructor(configService: ConfigService);
|
|
7
|
-
listDirectory(path: string): Promise<Project>;
|
|
8
|
-
readFile(path: string): Promise<Project>;
|
|
9
|
-
private parseArguments;
|
|
10
|
-
private sendRequest;
|
|
11
|
-
private executeQuery;
|
|
12
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const common_1 = require("@nestjs/common");
|
|
13
|
-
const config_1 = require("@nestjs/config");
|
|
14
|
-
const axios_1 = require("axios");
|
|
15
|
-
const queries_1 = require("../queries");
|
|
16
|
-
let GitlabFilesService = class GitlabFilesService {
|
|
17
|
-
configService;
|
|
18
|
-
constructor(configService) {
|
|
19
|
-
this.configService = configService;
|
|
20
|
-
}
|
|
21
|
-
async listDirectory(path) {
|
|
22
|
-
return this.executeQuery(path, queries_1.getDirectoryQuery);
|
|
23
|
-
}
|
|
24
|
-
async readFile(path) {
|
|
25
|
-
return this.executeQuery(path, queries_1.getReadFileQuery);
|
|
26
|
-
}
|
|
27
|
-
async parseArguments(path) {
|
|
28
|
-
const gitlabGroup = this.configService.get('GITLAB_GROUP');
|
|
29
|
-
const pathParts = path.split('/');
|
|
30
|
-
const project = pathParts[0];
|
|
31
|
-
const domain = project === gitlabGroup ? project : `${gitlabGroup}/${project}`;
|
|
32
|
-
const parsedPath = pathParts.slice(1).join('/');
|
|
33
|
-
return { domain, parsedPath };
|
|
34
|
-
}
|
|
35
|
-
async sendRequest(query) {
|
|
36
|
-
try {
|
|
37
|
-
const response = await (0, axios_1.default)({
|
|
38
|
-
url: 'https://gitlab.com/api/graphql',
|
|
39
|
-
method: 'post',
|
|
40
|
-
headers: {
|
|
41
|
-
'Content-Type': 'application/json',
|
|
42
|
-
Authorization: `Bearer ${this.configService.get('GITLAB_TOKEN')}`,
|
|
43
|
-
},
|
|
44
|
-
data: {
|
|
45
|
-
query,
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
return response.data.data.project;
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
throw new Error('Invalid query');
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async executeQuery(path, getQuery) {
|
|
55
|
-
const { domain, parsedPath } = await this.parseArguments(path);
|
|
56
|
-
const query = getQuery(domain, parsedPath);
|
|
57
|
-
return this.sendRequest(query);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
GitlabFilesService = __decorate([
|
|
61
|
-
(0, common_1.Injectable)(),
|
|
62
|
-
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
63
|
-
], GitlabFilesService);
|
|
64
|
-
exports.default = GitlabFilesService;
|
|
65
|
-
//# sourceMappingURL=gitlab-files.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab-files.service.js","sourceRoot":"","sources":["../../../../src/files/services/gitlab-files.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAA+C;AAC/C,iCAA0B;AAG1B,wCAAiE;AAKlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAEjB;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,2BAAiB,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,0BAAgB,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,IAAY;QAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAW,SAAS,CAAC,CAAC,CAAC,CAAC;QAGrC,MAAM,MAAM,GACV,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;QAElE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAa;QACrC,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC;gBAC3B,GAAG,EAAE,gCAAgC;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;iBAClE;gBACD,IAAI,EAAE;oBACJ,KAAK;iBACN;aACF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;SACnC;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,IAAY,EACZ,QAAuB;QAEvB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF,CAAA;AAtDoB,kBAAkB;IADtC,IAAA,mBAAU,GAAE;qCAGwB,sBAAa;GAF7B,kBAAkB,CAsDtC;kBAtDoB,kBAAkB"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const testing_1 = require("@nestjs/testing");
|
|
4
|
-
const config_1 = require("@nestjs/config");
|
|
5
|
-
const axios_1 = require("axios");
|
|
6
|
-
const gitlab_files_service_1 = require("../../src/files/services/gitlab-files.service");
|
|
7
|
-
const testUtil_1 = require("../testUtil");
|
|
8
|
-
describe('GitlabFilesService', () => {
|
|
9
|
-
let filesService;
|
|
10
|
-
const mockConfigService = new testUtil_1.MockConfigService();
|
|
11
|
-
jest.mock('axios');
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
const module = await testing_1.Test.createTestingModule({
|
|
14
|
-
providers: [
|
|
15
|
-
gitlab_files_service_1.default,
|
|
16
|
-
{ provide: config_1.ConfigService, useValue: mockConfigService },
|
|
17
|
-
],
|
|
18
|
-
})
|
|
19
|
-
.overrideProvider(config_1.ConfigService)
|
|
20
|
-
.useValue(mockConfigService)
|
|
21
|
-
.compile();
|
|
22
|
-
filesService = module.get(gitlab_files_service_1.default);
|
|
23
|
-
});
|
|
24
|
-
it('should list directory', async () => {
|
|
25
|
-
jest.spyOn(axios_1.default, 'post').mockResolvedValue({ data: testUtil_1.testDirectory });
|
|
26
|
-
const result = await filesService.listDirectory('user2');
|
|
27
|
-
expect(result).toEqual(testUtil_1.testDirectory);
|
|
28
|
-
});
|
|
29
|
-
it('should read file', async () => {
|
|
30
|
-
jest
|
|
31
|
-
.spyOn(axios_1.default, 'post')
|
|
32
|
-
.mockResolvedValue({ data: { data: testUtil_1.testFileContent } });
|
|
33
|
-
const result = await filesService.readFile(testUtil_1.pathToTestFileContent);
|
|
34
|
-
expect(result).toEqual(testUtil_1.testFileContent);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
//# sourceMappingURL=gitlab-files.service.unit.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab-files.service.unit.spec.js","sourceRoot":"","sources":["../../../test/unit/gitlab-files.service.unit.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,2CAA+C;AAC/C,iCAA0B;AAC1B,wFAA+E;AAC/E,0CAKqB;AAErB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,YAAgC,CAAC;IACrC,MAAM,iBAAiB,GAAG,IAAI,4BAAiB,EAAE,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE;gBACT,8BAAkB;gBAClB,EAAE,OAAO,EAAE,sBAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE;aACxD;SACF,CAAC;aACC,gBAAgB,CAAC,sBAAa,CAAC;aAC/B,QAAQ,CAAC,iBAAiB,CAAC;aAC3B,OAAO,EAAE,CAAC;QAEb,YAAY,GAAG,MAAM,CAAC,GAAG,CAAqB,8BAAkB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC,KAAK,CAAC,eAAK,EAAE,MAAM,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,wBAAa,EAAE,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,wBAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,IAAI;aACD,KAAK,CAAC,eAAK,EAAE,MAAM,CAAC;aACpB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,0BAAe,EAAE,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,gCAAqB,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,0BAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/src/files/queries.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export const getDirectoryQuery = (domain: string, parsedPath: string) => `
|
|
2
|
-
query listDirectory {
|
|
3
|
-
project(fullPath: "${domain}") {
|
|
4
|
-
repository {
|
|
5
|
-
tree(path: "${parsedPath}", recursive: false) {
|
|
6
|
-
blobs {
|
|
7
|
-
edges {
|
|
8
|
-
node {
|
|
9
|
-
name
|
|
10
|
-
type
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
trees {
|
|
15
|
-
edges {
|
|
16
|
-
node {
|
|
17
|
-
name
|
|
18
|
-
type
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
`;
|
|
27
|
-
|
|
28
|
-
export const getReadFileQuery = (domain: string, parsedPath: string) => `
|
|
29
|
-
query readFile {
|
|
30
|
-
project(fullPath: "${domain}") {
|
|
31
|
-
repository {
|
|
32
|
-
blobs(paths: "${parsedPath}") {
|
|
33
|
-
nodes {
|
|
34
|
-
name
|
|
35
|
-
rawBlob
|
|
36
|
-
rawTextBlob
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
`;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ConfigService } from '@nestjs/config';
|
|
3
|
-
import axios from 'axios';
|
|
4
|
-
import { Project } from 'src/types';
|
|
5
|
-
import { IFilesService } from '../interfaces/files.service.interface';
|
|
6
|
-
import { getDirectoryQuery, getReadFileQuery } from '../queries';
|
|
7
|
-
|
|
8
|
-
type QueryFunction = (domain: string, parsedPath: string) => string;
|
|
9
|
-
|
|
10
|
-
@Injectable()
|
|
11
|
-
export default class GitlabFilesService implements IFilesService {
|
|
12
|
-
// eslint-disable-next-line no-useless-constructor, no-empty-function
|
|
13
|
-
constructor(private configService: ConfigService) {}
|
|
14
|
-
|
|
15
|
-
async listDirectory(path: string): Promise<Project> {
|
|
16
|
-
return this.executeQuery(path, getDirectoryQuery);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async readFile(path: string): Promise<Project> {
|
|
20
|
-
return this.executeQuery(path, getReadFileQuery);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
private async parseArguments(
|
|
24
|
-
path: string,
|
|
25
|
-
): Promise<{ domain: string; parsedPath: string }> {
|
|
26
|
-
const gitlabGroup = this.configService.get('GITLAB_GROUP');
|
|
27
|
-
const pathParts: string[] = path.split('/');
|
|
28
|
-
const project: string = pathParts[0];
|
|
29
|
-
|
|
30
|
-
// Only prepend the gitlabGroup if it's not already part of the path
|
|
31
|
-
const domain: string =
|
|
32
|
-
project === gitlabGroup ? project : `${gitlabGroup}/${project}`;
|
|
33
|
-
|
|
34
|
-
const parsedPath = pathParts.slice(1).join('/');
|
|
35
|
-
return { domain, parsedPath };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private async sendRequest(query: string): Promise<Project> {
|
|
39
|
-
try {
|
|
40
|
-
const response = await axios({
|
|
41
|
-
url: 'https://gitlab.com/api/graphql',
|
|
42
|
-
method: 'post',
|
|
43
|
-
headers: {
|
|
44
|
-
'Content-Type': 'application/json',
|
|
45
|
-
Authorization: `Bearer ${this.configService.get('GITLAB_TOKEN')}`,
|
|
46
|
-
},
|
|
47
|
-
data: {
|
|
48
|
-
query,
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
return response.data.data.project;
|
|
52
|
-
} catch (error) {
|
|
53
|
-
throw new Error('Invalid query'); // Throw error instead of returning string
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private async executeQuery(
|
|
58
|
-
path: string,
|
|
59
|
-
getQuery: QueryFunction,
|
|
60
|
-
): Promise<Project> {
|
|
61
|
-
const { domain, parsedPath } = await this.parseArguments(path);
|
|
62
|
-
const query = getQuery(domain, parsedPath);
|
|
63
|
-
return this.sendRequest(query);
|
|
64
|
-
}
|
|
65
|
-
}
|
package/test/starttraefik.bash
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
echo "Starting the Traefik gateway"
|
|
4
|
-
cd ../../servers/config/gateway || exit 1
|
|
5
|
-
docker run -d \
|
|
6
|
-
--name "traefik-gateway" \
|
|
7
|
-
--network=host -v "$PWD/traefik.yml":/etc/traefik/traefik.yml \
|
|
8
|
-
-v "$PWD/dynamic":/etc/traefik/dynamic \
|
|
9
|
-
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
10
|
-
--restart always \
|
|
11
|
-
traefik:v2.10
|