itlab-internal-services 0.0.1
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/README.md +206 -0
- package/dist/guards/index.d.ts +3 -0
- package/dist/guards/index.js +19 -0
- package/dist/guards/internal.guard.d.ts +11 -0
- package/dist/guards/internal.guard.js +44 -0
- package/dist/guards/jwt.guard.d.ts +19 -0
- package/dist/guards/jwt.guard.js +51 -0
- package/dist/guards/perms.guard.d.ts +11 -0
- package/dist/guards/perms.guard.js +46 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +21 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +17 -0
- package/dist/interfaces/internal-module.interface.d.ts +17 -0
- package/dist/interfaces/internal-module.interface.js +2 -0
- package/dist/internal.constants.d.ts +6 -0
- package/dist/internal.constants.js +9 -0
- package/dist/internal.module.d.ts +10 -0
- package/dist/internal.module.js +126 -0
- package/dist/pipes/hid.pipe.d.ts +6 -0
- package/dist/pipes/hid.pipe.js +34 -0
- package/dist/pipes/id.pipe.d.ts +6 -0
- package/dist/pipes/id.pipe.js +27 -0
- package/dist/pipes/index.d.ts +3 -0
- package/dist/pipes/index.js +19 -0
- package/dist/pipes/target.pipe.d.ts +16 -0
- package/dist/pipes/target.pipe.js +45 -0
- package/dist/services/comment.service.d.ts +11 -0
- package/dist/services/comment.service.js +64 -0
- package/dist/services/content.service.d.ts +12 -0
- package/dist/services/content.service.js +74 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.js +19 -0
- package/dist/services/search.service.d.ts +8 -0
- package/dist/services/search.service.js +35 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# IT Lab Internal Services
|
|
2
|
+
> Diese Library funktioniert nur mit NestJs
|
|
3
|
+
|
|
4
|
+
[](https://www.npmjs.org/package/itlab-internal-services)
|
|
5
|
+
[](https://packagephobia.now.sh/result?p=itlab-internal-services)
|
|
6
|
+
[](http://npm-stat.com/charts.html?package=itlab-internal-services)
|
|
7
|
+
[](https://www.jsdelivr.com/package/npm/itlab-internal-services)
|
|
8
|
+
|
|
9
|
+
## Internal module
|
|
10
|
+
|
|
11
|
+
[Axios](https://github.com/axios/axios) is richly featured HTTP client package that is widely used. This package wraps Axios and exposes it via the built-in `InternalModule`. The `InternalModule` exports the `CommentService`, `ContentService` & `SearchService` classes, which exposes methods to perform HTTP requests to IT Labs internal services.
|
|
12
|
+
|
|
13
|
+
### Installation
|
|
14
|
+
|
|
15
|
+
To begin using it, we first install the required dependency.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
yarn add itlab-internal-services
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Getting started
|
|
22
|
+
|
|
23
|
+
Once the installation process is complete, to use the `InternalServices`, first import `InternalModule`.
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
@Module({
|
|
27
|
+
imports: [InternalModule],
|
|
28
|
+
providers: [NewsService],
|
|
29
|
+
})
|
|
30
|
+
export class NewsModule {}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Next, inject `CommentService`, `ContentService` or `SearchService` using normal constructor injection.
|
|
34
|
+
|
|
35
|
+
> **Hint** `InternalModule`, `CommentService`, `ContentService` & `SearchService` are imported from `itlab-internal-services` package.
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
@Injectable()
|
|
39
|
+
export class NewsService {
|
|
40
|
+
constructor(
|
|
41
|
+
private readonly commentService: CommentService,
|
|
42
|
+
private readonly contentService: ContentService,
|
|
43
|
+
private readonly searchService: SearchService,
|
|
44
|
+
) {}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Comment Service
|
|
49
|
+
```typescript
|
|
50
|
+
async post(targetId: string, authorId: string, comment: Comment): Promise<Comment>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
async delete(targetId: string): Promise<void>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Content Service
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
async verify(contents: Content[]): Promise<void>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
async post(targetId: string, contents: Content[]): Promise<void>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
async delete(targetId: string): Promise<void>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Pipes
|
|
72
|
+
```typescript
|
|
73
|
+
@Controller("news")
|
|
74
|
+
export class NewsController {
|
|
75
|
+
|
|
76
|
+
@ApiTarget("target")
|
|
77
|
+
@Get(":target")
|
|
78
|
+
getNews(@Target("target") target: string) {}
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
@Controller("news")
|
|
85
|
+
export class NewsController {
|
|
86
|
+
|
|
87
|
+
@ApiHid("hid")
|
|
88
|
+
@Get(":hid")
|
|
89
|
+
getNews(@Hid("hid") hid: string) {}
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
@Controller("news")
|
|
96
|
+
export class NewsController {
|
|
97
|
+
|
|
98
|
+
@ApiId("id")
|
|
99
|
+
@Get(":id")
|
|
100
|
+
getNews(@Id("id") id: string) {}
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Guards
|
|
106
|
+
```typescript
|
|
107
|
+
@Internal()
|
|
108
|
+
@Controller()
|
|
109
|
+
export class NewsController {}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
@Jwt()
|
|
114
|
+
@Controller()
|
|
115
|
+
export class NewsController {
|
|
116
|
+
@Get("")
|
|
117
|
+
getNews(@Account() account: LAccount) {}
|
|
118
|
+
|
|
119
|
+
@Get("")
|
|
120
|
+
getNews(@AccountId() accountId: string) {}
|
|
121
|
+
|
|
122
|
+
@Perms("perms.get", "perms.list")
|
|
123
|
+
@Get("")
|
|
124
|
+
getNews(@AccountId() accountId: string, @AccountPerms() accountPerms: string[]) {}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Configuration
|
|
129
|
+
|
|
130
|
+
To configure the underlying service instance, pass an optional options object to the `register()` method of `InternalModule` when importing it. This options object will be passed directly to the underlying service constructor.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
@Module({
|
|
134
|
+
imports: [
|
|
135
|
+
InternalModule.register({
|
|
136
|
+
target: Targets.NEWSROOM,
|
|
137
|
+
token: 'itlab token',
|
|
138
|
+
jwt_secret: 'secret',
|
|
139
|
+
}),
|
|
140
|
+
],
|
|
141
|
+
providers: [NewsService],
|
|
142
|
+
})
|
|
143
|
+
export class NewsModule {}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Async configuration
|
|
147
|
+
|
|
148
|
+
When you need to pass module options asynchronously instead of statically, use the `registerAsync()` method. As with most dynamic modules, this package provides several techniques to deal with async configuration.
|
|
149
|
+
|
|
150
|
+
One technique is to use a factory function:
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
InternalModule.registerAsync({
|
|
154
|
+
useFactory: () => ({
|
|
155
|
+
target: Targets.NEWSROOM,
|
|
156
|
+
token: 'itlab token',
|
|
157
|
+
jwt_secret: 'secret',
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Like other factory providers, our factory function can be [async](https://docs.nestjs.com/fundamentals/custom-providers#factory-providers-usefactory) and can inject dependencies through `inject`.
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
InternalModule.registerAsync({
|
|
166
|
+
imports: [ConfigModule],
|
|
167
|
+
useFactory: (configService: ConfigService) => ({
|
|
168
|
+
target: Targets.NEWSROOM,
|
|
169
|
+
token: configService.get<string>('K8S_TOKEN'),
|
|
170
|
+
jwt_secret: configService.get<string>('JWT_SECRET'),
|
|
171
|
+
}),
|
|
172
|
+
inject: [ConfigService],
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Alternatively, you can configure the `InternalModule` using a class instead of a factory, as shown below.
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
InternalModule.registerAsync({
|
|
180
|
+
useClass: InternalConfigService,
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
The construction above instantiates `InternalConfigService` inside `InternalModule`, using it to create an options object. Note that in this example, the `InternalConfigService` has to implement `InternalModuleOptionsFactory` interface as shown below. The `InternalModule` will call the `createInternalOptions()` method on the instantiated object of the supplied class.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
@Injectable()
|
|
188
|
+
class InternalConfigService implements InternalModuleOptionsFactory {
|
|
189
|
+
createInternalOptions(): InternalModuleOptions {
|
|
190
|
+
return {
|
|
191
|
+
target: Targets.NEWSROOM,
|
|
192
|
+
token: 'itlab token',
|
|
193
|
+
jwt_secret: 'secret',
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
If you want to reuse an existing options provider instead of creating a private copy inside the `InternalModule`, use the `useExisting` syntax.
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
InternalModule.registerAsync({
|
|
203
|
+
imports: [ConfigModule],
|
|
204
|
+
useExisting: InternalConfigService,
|
|
205
|
+
});
|
|
206
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./internal.guard"), exports);
|
|
18
|
+
__exportStar(require("./jwt.guard"), exports);
|
|
19
|
+
__exportStar(require("./perms.guard"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext, HttpException } from '@nestjs/common';
|
|
2
|
+
export declare const INTERNAL_HEADER_KEY = "X-itlab-k8s-auth";
|
|
3
|
+
export declare class InternalGuard implements CanActivate {
|
|
4
|
+
protected readonly headerToken: string;
|
|
5
|
+
constructor(headerToken?: string);
|
|
6
|
+
canActivate(ctx: ExecutionContext): boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class UnauthorizedApplicationException extends HttpException {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
export declare const Internal: <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Internal = exports.UnauthorizedApplicationException = exports.InternalGuard = exports.INTERNAL_HEADER_KEY = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const internal_constants_1 = require("../internal.constants");
|
|
19
|
+
exports.INTERNAL_HEADER_KEY = 'X-itlab-k8s-auth';
|
|
20
|
+
let InternalGuard = class InternalGuard {
|
|
21
|
+
constructor(headerToken = '') {
|
|
22
|
+
this.headerToken = headerToken;
|
|
23
|
+
}
|
|
24
|
+
canActivate(ctx) {
|
|
25
|
+
if (this.headerToken.length === 0)
|
|
26
|
+
return false;
|
|
27
|
+
if (this.headerToken ===
|
|
28
|
+
ctx.switchToHttp().getRequest().header(exports.INTERNAL_HEADER_KEY))
|
|
29
|
+
return true;
|
|
30
|
+
throw new UnauthorizedApplicationException();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
InternalGuard = __decorate([
|
|
34
|
+
__param(0, (0, common_1.Inject)(internal_constants_1.INTERNAL_MODULE_HEADER_TOKEN)),
|
|
35
|
+
__metadata("design:paramtypes", [String])
|
|
36
|
+
], InternalGuard);
|
|
37
|
+
exports.InternalGuard = InternalGuard;
|
|
38
|
+
class UnauthorizedApplicationException extends common_1.HttpException {
|
|
39
|
+
constructor() {
|
|
40
|
+
super('Application unauthorized', common_1.HttpStatus.UNAUTHORIZED);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.UnauthorizedApplicationException = UnauthorizedApplicationException;
|
|
44
|
+
exports.Internal = (0, common_1.applyDecorators)((0, swagger_1.ApiBasicAuth)(exports.INTERNAL_HEADER_KEY), (0, common_1.UseGuards)(InternalGuard), (0, swagger_1.ApiUnauthorizedResponse)({ description: 'Application unauthorized' }));
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface LAccount {
|
|
2
|
+
id: string;
|
|
3
|
+
perms: string[];
|
|
4
|
+
}
|
|
5
|
+
declare const JwtStrategy_base: new (...args: any[]) => any;
|
|
6
|
+
export declare class JwtStrategy extends JwtStrategy_base {
|
|
7
|
+
protected readonly jwtSecret: string;
|
|
8
|
+
constructor(jwtSecret?: string);
|
|
9
|
+
validate(payload: any): LAccount;
|
|
10
|
+
}
|
|
11
|
+
export declare const Account: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
12
|
+
export declare const AccountId: ParameterDecorator;
|
|
13
|
+
export declare const AccountPerms: ParameterDecorator;
|
|
14
|
+
export declare const JwtToken: (...dataOrPipes: any[]) => ParameterDecorator;
|
|
15
|
+
declare const JwtGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
16
|
+
export declare class JwtGuard extends JwtGuard_base {
|
|
17
|
+
}
|
|
18
|
+
export declare const Jwt: <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Jwt = exports.JwtGuard = exports.JwtToken = exports.AccountPerms = exports.AccountId = exports.Account = exports.JwtStrategy = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const passport_1 = require("@nestjs/passport");
|
|
18
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
19
|
+
const passport_jwt_1 = require("passport-jwt");
|
|
20
|
+
const internal_constants_1 = require("../internal.constants");
|
|
21
|
+
let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy, 'jwt') {
|
|
22
|
+
constructor(jwtSecret = 'unknown') {
|
|
23
|
+
super({
|
|
24
|
+
jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
|
|
25
|
+
secretOrKey: jwtSecret,
|
|
26
|
+
});
|
|
27
|
+
this.jwtSecret = jwtSecret;
|
|
28
|
+
}
|
|
29
|
+
validate(payload) {
|
|
30
|
+
return { id: payload.id, perms: payload.perms || [] };
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
JwtStrategy = __decorate([
|
|
34
|
+
__param(0, (0, common_1.Inject)(internal_constants_1.INTERNAL_MODULE_JWT_SECRET)),
|
|
35
|
+
__metadata("design:paramtypes", [String])
|
|
36
|
+
], JwtStrategy);
|
|
37
|
+
exports.JwtStrategy = JwtStrategy;
|
|
38
|
+
exports.Account = (0, common_1.createParamDecorator)((param, ctx) => {
|
|
39
|
+
const { user } = ctx.switchToHttp().getRequest();
|
|
40
|
+
return param ? user === null || user === void 0 ? void 0 : user[param] : user;
|
|
41
|
+
});
|
|
42
|
+
exports.AccountId = (0, exports.Account)('id');
|
|
43
|
+
exports.AccountPerms = (0, exports.Account)('perms');
|
|
44
|
+
exports.JwtToken = (0, common_1.createParamDecorator)((_, ctx) => {
|
|
45
|
+
const h = ctx.switchToHttp().getRequest().header('Authorization');
|
|
46
|
+
return h.replace('Bearer ', '');
|
|
47
|
+
});
|
|
48
|
+
class JwtGuard extends (0, passport_1.AuthGuard)('jwt') {
|
|
49
|
+
}
|
|
50
|
+
exports.JwtGuard = JwtGuard;
|
|
51
|
+
exports.Jwt = (0, common_1.applyDecorators)((0, common_1.UseGuards)(JwtGuard), (0, swagger_1.ApiBearerAuth)(), (0, swagger_1.ApiUnauthorizedResponse)({ description: 'Unauthorized' }));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext, HttpException } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
export declare class PermsGuard implements CanActivate {
|
|
4
|
+
private readonly reflector;
|
|
5
|
+
constructor(reflector: Reflector);
|
|
6
|
+
canActivate(ctx: ExecutionContext): boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class InsufficientPermissionsException extends HttpException {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
export declare function Perms(...perms: string[]): <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Perms = exports.InsufficientPermissionsException = exports.PermsGuard = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
const jwt_guard_1 = require("./jwt.guard");
|
|
7
|
+
const meta = 'permsguard';
|
|
8
|
+
function transformPermissions(permissions) {
|
|
9
|
+
const mapped = permissions.map((p) => {
|
|
10
|
+
return [p, p.split('.').slice(0, -1).join('.') + '.*'];
|
|
11
|
+
});
|
|
12
|
+
return [...new Set(mapped.flat())];
|
|
13
|
+
}
|
|
14
|
+
class PermsGuard {
|
|
15
|
+
constructor(reflector) {
|
|
16
|
+
this.reflector = reflector;
|
|
17
|
+
}
|
|
18
|
+
canActivate(ctx) {
|
|
19
|
+
let perms = this.reflector.get(meta, ctx.getHandler());
|
|
20
|
+
if (!perms || !perms.length || perms.length === 0) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
perms = transformPermissions(perms);
|
|
24
|
+
const { user } = ctx.switchToHttp().getRequest();
|
|
25
|
+
let userPerms = user.perms;
|
|
26
|
+
if (userPerms.length === 0)
|
|
27
|
+
throw new InsufficientPermissionsException();
|
|
28
|
+
userPerms = userPerms.map((x) => x.toLowerCase());
|
|
29
|
+
if (perms.some((p) => userPerms.includes(p.toLowerCase())))
|
|
30
|
+
return true;
|
|
31
|
+
throw new InsufficientPermissionsException();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.PermsGuard = PermsGuard;
|
|
35
|
+
class InsufficientPermissionsException extends common_1.HttpException {
|
|
36
|
+
constructor() {
|
|
37
|
+
super('Insufficient permissions', common_1.HttpStatus.UNAUTHORIZED);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.InsufficientPermissionsException = InsufficientPermissionsException;
|
|
41
|
+
function Perms(...perms) {
|
|
42
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(meta, perms), (0, common_1.UseGuards)(jwt_guard_1.JwtGuard, PermsGuard), (0, swagger_1.ApiBearerAuth)(), (0, swagger_1.ApiOperation)({ summary: 'Perms: ' + perms.join(', ') }), (0, swagger_1.ApiUnauthorizedResponse)({
|
|
43
|
+
description: 'Unauthorized or insufficient permissions',
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
exports.Perms = Perms;
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./guards"), exports);
|
|
18
|
+
__exportStar(require("./interfaces"), exports);
|
|
19
|
+
__exportStar(require("./internal.module"), exports);
|
|
20
|
+
__exportStar(require("./pipes"), exports);
|
|
21
|
+
__exportStar(require("./services"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './internal-module.interface';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./internal-module.interface"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ModuleMetadata, Provider, Type } from '@nestjs/common';
|
|
2
|
+
import { Targets } from '../pipes/target.pipe';
|
|
3
|
+
export declare type InternalModuleOptions = {
|
|
4
|
+
jwt_secret: string;
|
|
5
|
+
token: string;
|
|
6
|
+
target: Targets;
|
|
7
|
+
};
|
|
8
|
+
export interface InternalModuleOptionsFactory {
|
|
9
|
+
createInternalOptions(): Promise<InternalModuleOptions> | InternalModuleOptions;
|
|
10
|
+
}
|
|
11
|
+
export interface InternalModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
12
|
+
useExisting?: Type<InternalModuleOptionsFactory>;
|
|
13
|
+
useClass?: Type<InternalModuleOptionsFactory>;
|
|
14
|
+
useFactory?: (...args: any[]) => Promise<InternalModuleOptions> | InternalModuleOptions;
|
|
15
|
+
inject?: any[];
|
|
16
|
+
extraProviders?: Provider[];
|
|
17
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const AXIOS_INSTANCE_TOKEN = "AXIOS_INSTANCE_TOKEN";
|
|
2
|
+
export declare const INTERNAL_MODULE_ID = "INTERNAL_MODULE_ID";
|
|
3
|
+
export declare const INTERNAL_MODULE_OPTIONS = "INTERNAL_MODULE_OPTIONS";
|
|
4
|
+
export declare const INTERNAL_MODULE_TARGET = "INTERNAL_MODULE_TARGET";
|
|
5
|
+
export declare const INTERNAL_MODULE_JWT_SECRET = "INTERNAL_MODULE_JWT_SECRET";
|
|
6
|
+
export declare const INTERNAL_MODULE_HEADER_TOKEN = "INTERNAL_MODULE_HEADER_TOKEN";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INTERNAL_MODULE_HEADER_TOKEN = exports.INTERNAL_MODULE_JWT_SECRET = exports.INTERNAL_MODULE_TARGET = exports.INTERNAL_MODULE_OPTIONS = exports.INTERNAL_MODULE_ID = exports.AXIOS_INSTANCE_TOKEN = void 0;
|
|
4
|
+
exports.AXIOS_INSTANCE_TOKEN = 'AXIOS_INSTANCE_TOKEN';
|
|
5
|
+
exports.INTERNAL_MODULE_ID = 'INTERNAL_MODULE_ID';
|
|
6
|
+
exports.INTERNAL_MODULE_OPTIONS = 'INTERNAL_MODULE_OPTIONS';
|
|
7
|
+
exports.INTERNAL_MODULE_TARGET = 'INTERNAL_MODULE_TARGET';
|
|
8
|
+
exports.INTERNAL_MODULE_JWT_SECRET = 'INTERNAL_MODULE_JWT_SECRET';
|
|
9
|
+
exports.INTERNAL_MODULE_HEADER_TOKEN = 'INTERNAL_MODULE_HEADER_TOKEN';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { InternalModuleAsyncOptions, InternalModuleOptions } from './interfaces';
|
|
3
|
+
export declare class InternalModule {
|
|
4
|
+
static register(options: InternalModuleOptions): DynamicModule;
|
|
5
|
+
static registerAsync(options: InternalModuleAsyncOptions): DynamicModule;
|
|
6
|
+
static forRoot(options: InternalModuleOptions): DynamicModule;
|
|
7
|
+
static forRootAsync(options: InternalModuleAsyncOptions): DynamicModule;
|
|
8
|
+
private static createAsyncProviders;
|
|
9
|
+
private static createAsyncOptionsProvider;
|
|
10
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
var InternalModule_1;
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.InternalModule = void 0;
|
|
23
|
+
const common_1 = require("@nestjs/common");
|
|
24
|
+
const random_string_generator_util_1 = require("@nestjs/common/utils/random-string-generator.util");
|
|
25
|
+
const axios_1 = __importDefault(require("axios"));
|
|
26
|
+
const internal_constants_1 = require("./internal.constants");
|
|
27
|
+
const services_1 = require("./services");
|
|
28
|
+
const axiosConfig = (config) => ({
|
|
29
|
+
baseURL: 'https://services.svi-itlab.com/',
|
|
30
|
+
headers: { 'X-itlab-k8s-auth': config.token },
|
|
31
|
+
});
|
|
32
|
+
let InternalModule = InternalModule_1 = class InternalModule {
|
|
33
|
+
static register(options) {
|
|
34
|
+
return {
|
|
35
|
+
module: InternalModule_1,
|
|
36
|
+
providers: [
|
|
37
|
+
{
|
|
38
|
+
provide: internal_constants_1.AXIOS_INSTANCE_TOKEN,
|
|
39
|
+
useValue: axios_1.default.create(axiosConfig(options)),
|
|
40
|
+
},
|
|
41
|
+
{ provide: internal_constants_1.INTERNAL_MODULE_ID, useValue: (0, random_string_generator_util_1.randomStringGenerator)() },
|
|
42
|
+
{ provide: internal_constants_1.INTERNAL_MODULE_TARGET, useValue: options.target },
|
|
43
|
+
{ provide: internal_constants_1.INTERNAL_MODULE_HEADER_TOKEN, useValue: options.token },
|
|
44
|
+
{ provide: internal_constants_1.INTERNAL_MODULE_JWT_SECRET, useValue: options.jwt_secret },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
static registerAsync(options) {
|
|
49
|
+
return {
|
|
50
|
+
module: InternalModule_1,
|
|
51
|
+
imports: options.imports,
|
|
52
|
+
providers: [
|
|
53
|
+
...this.createAsyncProviders(options),
|
|
54
|
+
{
|
|
55
|
+
provide: internal_constants_1.AXIOS_INSTANCE_TOKEN,
|
|
56
|
+
useFactory: (config) => axios_1.default.create(axiosConfig(config)),
|
|
57
|
+
inject: [internal_constants_1.INTERNAL_MODULE_OPTIONS],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
provide: internal_constants_1.INTERNAL_MODULE_ID,
|
|
61
|
+
useValue: (0, random_string_generator_util_1.randomStringGenerator)(),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
provide: internal_constants_1.INTERNAL_MODULE_TARGET,
|
|
65
|
+
useFactory: (config) => config.target,
|
|
66
|
+
inject: [internal_constants_1.INTERNAL_MODULE_OPTIONS],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
provide: internal_constants_1.INTERNAL_MODULE_HEADER_TOKEN,
|
|
70
|
+
useFactory: (config) => config.token,
|
|
71
|
+
inject: [internal_constants_1.INTERNAL_MODULE_OPTIONS],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
provide: internal_constants_1.INTERNAL_MODULE_JWT_SECRET,
|
|
75
|
+
useFactory: (config) => config.jwt_secret,
|
|
76
|
+
inject: [internal_constants_1.INTERNAL_MODULE_OPTIONS],
|
|
77
|
+
},
|
|
78
|
+
...(options.extraProviders || []),
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
static forRoot(options) {
|
|
83
|
+
return Object.assign(Object.assign({}, this.register(options)), { global: true });
|
|
84
|
+
}
|
|
85
|
+
static forRootAsync(options) {
|
|
86
|
+
return Object.assign(Object.assign({}, this.registerAsync(options)), { global: true });
|
|
87
|
+
}
|
|
88
|
+
static createAsyncProviders(options) {
|
|
89
|
+
if (options.useExisting || options.useFactory) {
|
|
90
|
+
return [this.createAsyncOptionsProvider(options)];
|
|
91
|
+
}
|
|
92
|
+
return [
|
|
93
|
+
this.createAsyncOptionsProvider(options),
|
|
94
|
+
{
|
|
95
|
+
provide: options.useClass,
|
|
96
|
+
useClass: options.useClass,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
static createAsyncOptionsProvider(options) {
|
|
101
|
+
if (options.useFactory) {
|
|
102
|
+
return {
|
|
103
|
+
provide: internal_constants_1.INTERNAL_MODULE_OPTIONS,
|
|
104
|
+
useFactory: options.useFactory,
|
|
105
|
+
inject: options.inject || [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
provide: internal_constants_1.INTERNAL_MODULE_OPTIONS,
|
|
110
|
+
useFactory: (optionsFactory) => __awaiter(this, void 0, void 0, function* () { return optionsFactory.createInternalOptions(); }),
|
|
111
|
+
inject: [options.useExisting || options.useClass],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
InternalModule = InternalModule_1 = __decorate([
|
|
116
|
+
(0, common_1.Module)({
|
|
117
|
+
providers: [
|
|
118
|
+
services_1.CommentService,
|
|
119
|
+
services_1.ContentService,
|
|
120
|
+
services_1.SearchService,
|
|
121
|
+
{ provide: internal_constants_1.AXIOS_INSTANCE_TOKEN, useValue: axios_1.default },
|
|
122
|
+
],
|
|
123
|
+
exports: [services_1.CommentService, services_1.ContentService, services_1.SearchService],
|
|
124
|
+
})
|
|
125
|
+
], InternalModule);
|
|
126
|
+
exports.InternalModule = InternalModule;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
export declare class InvalidHidException extends HttpException {
|
|
3
|
+
constructor(param: string);
|
|
4
|
+
}
|
|
5
|
+
export declare const Hid: (param: string) => ParameterDecorator;
|
|
6
|
+
export declare const ApiHid: (param: string) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiHid = exports.Hid = exports.InvalidHidException = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
const itlab_functions_1 = require("itlab-functions");
|
|
7
|
+
class ParseHidPipe {
|
|
8
|
+
constructor(param) {
|
|
9
|
+
this.param = param;
|
|
10
|
+
}
|
|
11
|
+
transform(value) {
|
|
12
|
+
const isString = typeof value === 'string' || value instanceof String;
|
|
13
|
+
if (isString && (0, itlab_functions_1.isID)(value.toString()))
|
|
14
|
+
return value.toString();
|
|
15
|
+
throw new InvalidHidException(this.param);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
class InvalidHidException extends common_1.HttpException {
|
|
19
|
+
constructor(param) {
|
|
20
|
+
super(`Invalid parameter '${param}'`, common_1.HttpStatus.BAD_REQUEST);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.InvalidHidException = InvalidHidException;
|
|
24
|
+
const Hid = (param) => (0, common_1.Param)(param, new ParseHidPipe(param));
|
|
25
|
+
exports.Hid = Hid;
|
|
26
|
+
const ApiHid = (param) => (0, common_1.applyDecorators)((0, swagger_1.ApiParam)({
|
|
27
|
+
name: param,
|
|
28
|
+
example: 'hallo-welt',
|
|
29
|
+
examples: {
|
|
30
|
+
'Hallo Welt': { value: 'hallo-welt' },
|
|
31
|
+
'Heute ist ein toller Tag': { value: 'heute-ist-ein-toller-tag' },
|
|
32
|
+
},
|
|
33
|
+
}), (0, swagger_1.ApiBadRequestResponse)({ description: 'Invalid parameter' }));
|
|
34
|
+
exports.ApiHid = ApiHid;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
export declare class InvalidIdException extends HttpException {
|
|
3
|
+
constructor(param: string);
|
|
4
|
+
}
|
|
5
|
+
export declare const Id: (param: string) => ParameterDecorator;
|
|
6
|
+
export declare const ApiId: (param: string) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiId = exports.Id = exports.InvalidIdException = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
class ParseIdPipe {
|
|
7
|
+
constructor(param) {
|
|
8
|
+
this.param = param;
|
|
9
|
+
}
|
|
10
|
+
transform(value) {
|
|
11
|
+
const isString = typeof value === 'string' || value instanceof String;
|
|
12
|
+
const isMongoId = /^(0x|0h)?[0-9A-F]+$/i.test(value) && value.length === 24;
|
|
13
|
+
if (isString && isMongoId)
|
|
14
|
+
return value.toString();
|
|
15
|
+
throw new InvalidIdException(this.param);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
class InvalidIdException extends common_1.HttpException {
|
|
19
|
+
constructor(param) {
|
|
20
|
+
super(`Invalid parameter '${param}'`, common_1.HttpStatus.BAD_REQUEST);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.InvalidIdException = InvalidIdException;
|
|
24
|
+
const Id = (param) => (0, common_1.Param)(param, new ParseIdPipe(param));
|
|
25
|
+
exports.Id = Id;
|
|
26
|
+
const ApiId = (param) => (0, common_1.applyDecorators)((0, swagger_1.ApiParam)({ name: param, example: ''.padEnd(24, '0') }), (0, swagger_1.ApiBadRequestResponse)({ description: 'Invalid parameter' }));
|
|
27
|
+
exports.ApiId = ApiId;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./hid.pipe"), exports);
|
|
18
|
+
__exportStar(require("./id.pipe"), exports);
|
|
19
|
+
__exportStar(require("./target.pipe"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
export declare enum Targets {
|
|
3
|
+
NEWSROOM = "news",
|
|
4
|
+
EVENTS = "event",
|
|
5
|
+
DEMOHIVE = "demo",
|
|
6
|
+
PODCASTS = "podcast",
|
|
7
|
+
SNIPPETS = "snippet",
|
|
8
|
+
BLIPS = "blip",
|
|
9
|
+
BOOKS = "book",
|
|
10
|
+
UNKNOWN = "unknown"
|
|
11
|
+
}
|
|
12
|
+
export declare class InvalidTargetException extends HttpException {
|
|
13
|
+
constructor(param: string);
|
|
14
|
+
}
|
|
15
|
+
export declare const Target: (param: string) => ParameterDecorator;
|
|
16
|
+
export declare const ApiTarget: (param: string) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiTarget = exports.Target = exports.InvalidTargetException = exports.Targets = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
var Targets;
|
|
7
|
+
(function (Targets) {
|
|
8
|
+
Targets["NEWSROOM"] = "news";
|
|
9
|
+
Targets["EVENTS"] = "event";
|
|
10
|
+
Targets["DEMOHIVE"] = "demo";
|
|
11
|
+
Targets["PODCASTS"] = "podcast";
|
|
12
|
+
Targets["SNIPPETS"] = "snippet";
|
|
13
|
+
Targets["BLIPS"] = "blip";
|
|
14
|
+
Targets["BOOKS"] = "book";
|
|
15
|
+
Targets["UNKNOWN"] = "unknown";
|
|
16
|
+
})(Targets = exports.Targets || (exports.Targets = {}));
|
|
17
|
+
function generateExamples() {
|
|
18
|
+
const map = {};
|
|
19
|
+
Object.entries(Targets).forEach(([value, key]) => (map[key] = { value }));
|
|
20
|
+
return map;
|
|
21
|
+
}
|
|
22
|
+
class ParseTargetPipe {
|
|
23
|
+
constructor(param) {
|
|
24
|
+
this.param = param;
|
|
25
|
+
}
|
|
26
|
+
transform(value) {
|
|
27
|
+
if (Object.values(Targets).includes(value))
|
|
28
|
+
return value;
|
|
29
|
+
throw new InvalidTargetException(this.param);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class InvalidTargetException extends common_1.HttpException {
|
|
33
|
+
constructor(param) {
|
|
34
|
+
super(`Invalid parameter '${param}'`, common_1.HttpStatus.BAD_REQUEST);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.InvalidTargetException = InvalidTargetException;
|
|
38
|
+
const Target = (param) => (0, common_1.Param)(param, new ParseTargetPipe(param));
|
|
39
|
+
exports.Target = Target;
|
|
40
|
+
const ApiTarget = (param) => (0, common_1.applyDecorators)((0, swagger_1.ApiParam)({
|
|
41
|
+
name: param,
|
|
42
|
+
example: Targets.NEWSROOM,
|
|
43
|
+
examples: generateExamples(),
|
|
44
|
+
}), (0, swagger_1.ApiBadRequestResponse)({ description: 'Invalid parameter' }));
|
|
45
|
+
exports.ApiTarget = ApiTarget;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { Targets } from '../pipes/target.pipe';
|
|
3
|
+
export declare type Comment = unknown;
|
|
4
|
+
export declare class CommentService {
|
|
5
|
+
protected readonly instance: AxiosInstance;
|
|
6
|
+
protected readonly target: Targets;
|
|
7
|
+
protected readonly prefix: string;
|
|
8
|
+
constructor(instance?: AxiosInstance, target?: Targets, prefix?: string);
|
|
9
|
+
post(targetId: string, authorId: string, comment: Comment): Promise<Comment>;
|
|
10
|
+
delete(targetId: string): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.CommentService = void 0;
|
|
28
|
+
const common_1 = require("@nestjs/common");
|
|
29
|
+
const axios_1 = __importDefault(require("axios"));
|
|
30
|
+
const internal_constants_1 = require("../internal.constants");
|
|
31
|
+
const target_pipe_1 = require("../pipes/target.pipe");
|
|
32
|
+
let CommentService = class CommentService {
|
|
33
|
+
constructor(instance = axios_1.default, target = target_pipe_1.Targets.UNKNOWN, prefix = 'comment/internal') {
|
|
34
|
+
this.instance = instance;
|
|
35
|
+
this.target = target;
|
|
36
|
+
this.prefix = prefix;
|
|
37
|
+
}
|
|
38
|
+
post(targetId, authorId, comment) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.instance
|
|
42
|
+
.post(`${this.prefix}/${this.target}/${targetId}/${authorId}`, comment)
|
|
43
|
+
.then(({ data }) => resolve(data))
|
|
44
|
+
.catch(({ response }) => reject(new common_1.HttpException(response.data, response.status)));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
delete(targetId) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
this.instance
|
|
52
|
+
.delete(`${this.prefix}/${this.target}/${targetId}`)
|
|
53
|
+
.then(() => resolve())
|
|
54
|
+
.catch(({ response }) => reject(new common_1.HttpException(response.data, response.status)));
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
CommentService = __decorate([
|
|
60
|
+
__param(0, (0, common_1.Inject)(internal_constants_1.AXIOS_INSTANCE_TOKEN)),
|
|
61
|
+
__param(1, (0, common_1.Inject)(internal_constants_1.INTERNAL_MODULE_TARGET)),
|
|
62
|
+
__metadata("design:paramtypes", [Function, String, Object])
|
|
63
|
+
], CommentService);
|
|
64
|
+
exports.CommentService = CommentService;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { Targets } from '../pipes/target.pipe';
|
|
3
|
+
export declare type Content = unknown[];
|
|
4
|
+
export declare class ContentService {
|
|
5
|
+
protected readonly instance: AxiosInstance;
|
|
6
|
+
protected readonly target: Targets;
|
|
7
|
+
protected readonly prefix: string;
|
|
8
|
+
constructor(instance?: AxiosInstance, target?: Targets, prefix?: string);
|
|
9
|
+
verify(contents: Content[]): Promise<void>;
|
|
10
|
+
post(targetId: string, contents: Content[]): Promise<void>;
|
|
11
|
+
delete(targetId: string): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.ContentService = void 0;
|
|
28
|
+
const common_1 = require("@nestjs/common");
|
|
29
|
+
const axios_1 = __importDefault(require("axios"));
|
|
30
|
+
const internal_constants_1 = require("../internal.constants");
|
|
31
|
+
const target_pipe_1 = require("../pipes/target.pipe");
|
|
32
|
+
let ContentService = class ContentService {
|
|
33
|
+
constructor(instance = axios_1.default, target = target_pipe_1.Targets.UNKNOWN, prefix = 'content/internal') {
|
|
34
|
+
this.instance = instance;
|
|
35
|
+
this.target = target;
|
|
36
|
+
this.prefix = prefix;
|
|
37
|
+
}
|
|
38
|
+
verify(contents) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.instance
|
|
42
|
+
.post(`${this.prefix}/verify`, { contents })
|
|
43
|
+
.then(() => resolve())
|
|
44
|
+
.catch(({ response }) => reject(new common_1.HttpException(response.data, response.status)));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
post(targetId, contents) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
this.instance
|
|
52
|
+
.post(`${this.prefix}/${this.target}/${targetId}`, { contents })
|
|
53
|
+
.then(() => resolve())
|
|
54
|
+
.catch(({ response }) => reject(new common_1.HttpException(response.data, response.status)));
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
delete(targetId) {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
this.instance
|
|
62
|
+
.delete(`${this.prefix}/${this.target}/${targetId}`)
|
|
63
|
+
.then(() => resolve())
|
|
64
|
+
.catch(({ response }) => reject(new common_1.HttpException(response.data, response.status)));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
ContentService = __decorate([
|
|
70
|
+
__param(0, (0, common_1.Inject)(internal_constants_1.AXIOS_INSTANCE_TOKEN)),
|
|
71
|
+
__param(1, (0, common_1.Inject)(internal_constants_1.INTERNAL_MODULE_TARGET)),
|
|
72
|
+
__metadata("design:paramtypes", [Function, String, Object])
|
|
73
|
+
], ContentService);
|
|
74
|
+
exports.ContentService = ContentService;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./comment.service"), exports);
|
|
18
|
+
__exportStar(require("./content.service"), exports);
|
|
19
|
+
__exportStar(require("./search.service"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { Targets } from '../pipes/target.pipe';
|
|
3
|
+
export declare class SearchService {
|
|
4
|
+
protected readonly instance: AxiosInstance;
|
|
5
|
+
protected readonly target: Targets;
|
|
6
|
+
protected readonly prefix: string;
|
|
7
|
+
constructor(instance?: AxiosInstance, target?: Targets, prefix?: string);
|
|
8
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.SearchService = void 0;
|
|
19
|
+
const common_1 = require("@nestjs/common");
|
|
20
|
+
const axios_1 = __importDefault(require("axios"));
|
|
21
|
+
const internal_constants_1 = require("../internal.constants");
|
|
22
|
+
const target_pipe_1 = require("../pipes/target.pipe");
|
|
23
|
+
let SearchService = class SearchService {
|
|
24
|
+
constructor(instance = axios_1.default, target = target_pipe_1.Targets.UNKNOWN, prefix = 'search/internal') {
|
|
25
|
+
this.instance = instance;
|
|
26
|
+
this.target = target;
|
|
27
|
+
this.prefix = prefix;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
SearchService = __decorate([
|
|
31
|
+
__param(0, (0, common_1.Inject)(internal_constants_1.AXIOS_INSTANCE_TOKEN)),
|
|
32
|
+
__param(1, (0, common_1.Inject)(internal_constants_1.INTERNAL_MODULE_TARGET)),
|
|
33
|
+
__metadata("design:paramtypes", [Function, String, Object])
|
|
34
|
+
], SearchService);
|
|
35
|
+
exports.SearchService = SearchService;
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "itlab-internal-services",
|
|
3
|
+
"author": {
|
|
4
|
+
"name": "Timo Scheuermann",
|
|
5
|
+
"email": "timo.scheuermann@sv-informatik.de",
|
|
6
|
+
"url": "https://timos.design"
|
|
7
|
+
},
|
|
8
|
+
"version": "0.0.1",
|
|
9
|
+
"type": "commonjs",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "rimraf -rf dist && tsc -p tsconfig.json",
|
|
17
|
+
"typecheck": "vue-tsc --noEmit",
|
|
18
|
+
"release:major": "npm version major && git push origin master --follow-tags",
|
|
19
|
+
"release:minor": "npm version minor && git push origin master --follow-tags",
|
|
20
|
+
"release:patch": "npm version patch && git push origin master --follow-tags",
|
|
21
|
+
"release": "npm run release:major",
|
|
22
|
+
"prepack": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"axios": "1.1.3",
|
|
26
|
+
"itlab-functions": "^0.0.2"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@nestjs/common": "9.2.0",
|
|
30
|
+
"@nestjs/core": "9.2.0",
|
|
31
|
+
"@nestjs/passport": "^9.0.0",
|
|
32
|
+
"@nestjs/platform-express": "9.2.0",
|
|
33
|
+
"@nestjs/swagger": "^6.1.3",
|
|
34
|
+
"@types/node": "18.11.9",
|
|
35
|
+
"@typescript-eslint/eslint-plugin": "5.42.1",
|
|
36
|
+
"@typescript-eslint/parser": "5.42.1",
|
|
37
|
+
"eslint": "8.27.0",
|
|
38
|
+
"eslint-config-prettier": "8.5.0",
|
|
39
|
+
"eslint-plugin-import": "2.26.0",
|
|
40
|
+
"jest": "29.3.1",
|
|
41
|
+
"lint-staged": "13.0.3",
|
|
42
|
+
"passport-jwt": "^4.0.0",
|
|
43
|
+
"prettier": "2.7.1",
|
|
44
|
+
"reflect-metadata": "0.1.13",
|
|
45
|
+
"rimraf": "3.0.2",
|
|
46
|
+
"rxjs": "7.5.7",
|
|
47
|
+
"ts-jest": "29.0.3",
|
|
48
|
+
"typescript": "4.8.4"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"@nestjs/common": "^8.0.0 || ^9.0.0",
|
|
52
|
+
"@nestjs/core": "^8.0.0 || ^9.0.0",
|
|
53
|
+
"@nestjs/passport": "^8.0.0 || ^9.0.0",
|
|
54
|
+
"@nestjs/swagger": "^6.0.0",
|
|
55
|
+
"passport-jwt": "^4.0.0",
|
|
56
|
+
"reflect-metadata": "^0.1.12",
|
|
57
|
+
"rxjs": "^6.0.0 || ^7.0.0"
|
|
58
|
+
},
|
|
59
|
+
"lint-staged": {
|
|
60
|
+
"**/*.{ts,json}": []
|
|
61
|
+
}
|
|
62
|
+
}
|