@skroz/profile-api 1.0.29 → 1.0.31
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/dist/entities/TypeOrmSettingsEntity.d.ts +6 -0
- package/dist/entities/TypeOrmSettingsEntity.js +29 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -1
- package/dist/repositories/TypeOrmSettingsRepository.d.ts +8 -0
- package/dist/repositories/TypeOrmSettingsRepository.js +77 -0
- package/dist/utils/password.d.ts +5 -0
- package/dist/utils/password.js +15 -0
- package/package.json +2 -2
- package/src/entities/TypeOrmSettingsEntity.ts +13 -0
- package/src/index.ts +3 -0
- package/src/repositories/TypeOrmSettingsRepository.ts +67 -0
- package/src/utils/password.ts +16 -0
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
exports.TypeOrmSettingsEntity = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
const TypeOrmBaseEntity_1 = require("./TypeOrmBaseEntity");
|
|
15
|
+
class TypeOrmSettingsEntity extends TypeOrmBaseEntity_1.TypeOrmBaseEntity {
|
|
16
|
+
}
|
|
17
|
+
exports.TypeOrmSettingsEntity = TypeOrmSettingsEntity;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, typeorm_1.Column)(),
|
|
20
|
+
__metadata("design:type", String)
|
|
21
|
+
], TypeOrmSettingsEntity.prototype, "key", void 0);
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, typeorm_1.Column)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], TypeOrmSettingsEntity.prototype, "type", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, typeorm_1.Column)(),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], TypeOrmSettingsEntity.prototype, "value", void 0);
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from './types';
|
|
|
2
2
|
export * from './adapters/TypeOrmProfileAdapter';
|
|
3
3
|
export * from './entities/TypeOrmBaseEntity';
|
|
4
4
|
export * from './entities/TypeOrmBaseUser';
|
|
5
|
+
export * from './entities/TypeOrmSettingsEntity';
|
|
6
|
+
export * from './repositories/TypeOrmSettingsRepository';
|
|
5
7
|
export * from './services/ProfileAuthService';
|
|
6
8
|
export * from './services/ProfileEmailService';
|
|
7
9
|
export * from './dto';
|
|
@@ -11,3 +13,4 @@ export * from './resolvers/createOauthResolver';
|
|
|
11
13
|
export * from './oauth';
|
|
12
14
|
export { default as createEntityDataLoader } from './utils/createEntityDataLoader';
|
|
13
15
|
export { getEncryptor, getGlobalId } from './utils/encryptor';
|
|
16
|
+
export { default as password } from './utils/password';
|
package/dist/index.js
CHANGED
|
@@ -17,11 +17,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.getGlobalId = exports.getEncryptor = exports.createEntityDataLoader = void 0;
|
|
20
|
+
exports.password = exports.getGlobalId = exports.getEncryptor = exports.createEntityDataLoader = void 0;
|
|
21
21
|
__exportStar(require("./types"), exports);
|
|
22
22
|
__exportStar(require("./adapters/TypeOrmProfileAdapter"), exports);
|
|
23
23
|
__exportStar(require("./entities/TypeOrmBaseEntity"), exports);
|
|
24
24
|
__exportStar(require("./entities/TypeOrmBaseUser"), exports);
|
|
25
|
+
__exportStar(require("./entities/TypeOrmSettingsEntity"), exports);
|
|
26
|
+
__exportStar(require("./repositories/TypeOrmSettingsRepository"), exports);
|
|
25
27
|
__exportStar(require("./services/ProfileAuthService"), exports);
|
|
26
28
|
__exportStar(require("./services/ProfileEmailService"), exports);
|
|
27
29
|
__exportStar(require("./dto"), exports);
|
|
@@ -34,3 +36,5 @@ Object.defineProperty(exports, "createEntityDataLoader", { enumerable: true, get
|
|
|
34
36
|
var encryptor_1 = require("./utils/encryptor");
|
|
35
37
|
Object.defineProperty(exports, "getEncryptor", { enumerable: true, get: function () { return encryptor_1.getEncryptor; } });
|
|
36
38
|
Object.defineProperty(exports, "getGlobalId", { enumerable: true, get: function () { return encryptor_1.getGlobalId; } });
|
|
39
|
+
var password_1 = require("./utils/password");
|
|
40
|
+
Object.defineProperty(exports, "password", { enumerable: true, get: function () { return __importDefault(password_1).default; } });
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
import { TypeOrmSettingsEntity } from '../entities/TypeOrmSettingsEntity';
|
|
3
|
+
export declare abstract class TypeOrmSettingsRepository<TEntity extends TypeOrmSettingsEntity, TPayload extends Record<string, unknown>> extends Repository<TEntity> {
|
|
4
|
+
private stringToBoolean;
|
|
5
|
+
private getValue;
|
|
6
|
+
get(): Promise<TPayload>;
|
|
7
|
+
set(data: Partial<TPayload>): Promise<TPayload>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.TypeOrmSettingsRepository = void 0;
|
|
19
|
+
const typeorm_1 = require("typeorm");
|
|
20
|
+
let TypeOrmSettingsRepository = class TypeOrmSettingsRepository extends typeorm_1.Repository {
|
|
21
|
+
stringToBoolean(string) {
|
|
22
|
+
switch (string.toLowerCase().trim()) {
|
|
23
|
+
case 'true':
|
|
24
|
+
case 'yes':
|
|
25
|
+
case '1':
|
|
26
|
+
return true;
|
|
27
|
+
case 'false':
|
|
28
|
+
case 'no':
|
|
29
|
+
case '0':
|
|
30
|
+
return false;
|
|
31
|
+
default:
|
|
32
|
+
return Boolean(string);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
getValue(setting) {
|
|
36
|
+
if (setting.type === 'string')
|
|
37
|
+
return setting.value;
|
|
38
|
+
if (setting.type === 'number')
|
|
39
|
+
return Number(setting.value);
|
|
40
|
+
if (setting.type === 'boolean')
|
|
41
|
+
return this.stringToBoolean(setting.value);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
get() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const settings = yield this.find();
|
|
47
|
+
return settings.reduce((acc, setting) => (Object.assign(Object.assign({}, acc), { [setting.key]: this.getValue(setting) })), {});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
set(data) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const keys = Object.keys(data).filter((key) => data[key] !== undefined);
|
|
53
|
+
if (keys.length === 0)
|
|
54
|
+
return this.get();
|
|
55
|
+
const condition = { key: (0, typeorm_1.In)(keys) };
|
|
56
|
+
yield this.delete(condition);
|
|
57
|
+
const settings = keys.reduce((acc, key) => {
|
|
58
|
+
const value = data[key];
|
|
59
|
+
if (value === null)
|
|
60
|
+
return acc;
|
|
61
|
+
const setting = {
|
|
62
|
+
key,
|
|
63
|
+
type: typeof value,
|
|
64
|
+
value: String(value),
|
|
65
|
+
};
|
|
66
|
+
return [...acc, setting];
|
|
67
|
+
}, []);
|
|
68
|
+
if (settings.length > 0)
|
|
69
|
+
yield this.save(settings);
|
|
70
|
+
return this.get();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.TypeOrmSettingsRepository = TypeOrmSettingsRepository;
|
|
75
|
+
exports.TypeOrmSettingsRepository = TypeOrmSettingsRepository = __decorate([
|
|
76
|
+
(0, typeorm_1.EntityRepository)()
|
|
77
|
+
], TypeOrmSettingsRepository);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const argon2_1 = __importDefault(require("argon2"));
|
|
7
|
+
const hash = (password) => argon2_1.default.hash(password, {
|
|
8
|
+
type: argon2_1.default.argon2id,
|
|
9
|
+
});
|
|
10
|
+
const verify = (passwordHash, password) => argon2_1.default.verify(passwordHash, password);
|
|
11
|
+
const password = {
|
|
12
|
+
hash,
|
|
13
|
+
verify,
|
|
14
|
+
};
|
|
15
|
+
exports.default = password;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skroz/profile-api",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.31",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "git@gitlab.com:skroz/libs/utils.git",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"type-graphql": "^1.1.1",
|
|
46
46
|
"typeorm": "^0.2.45"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "8697c57820dca9401529a1ca4cf8a517e4e9ff3f"
|
|
49
49
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Column } from 'typeorm';
|
|
2
|
+
import { TypeOrmBaseEntity } from './TypeOrmBaseEntity';
|
|
3
|
+
|
|
4
|
+
export abstract class TypeOrmSettingsEntity extends TypeOrmBaseEntity {
|
|
5
|
+
@Column()
|
|
6
|
+
public key!: string;
|
|
7
|
+
|
|
8
|
+
@Column()
|
|
9
|
+
public type!: string;
|
|
10
|
+
|
|
11
|
+
@Column()
|
|
12
|
+
public value!: string;
|
|
13
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,8 @@ export * from './types';
|
|
|
2
2
|
export * from './adapters/TypeOrmProfileAdapter';
|
|
3
3
|
export * from './entities/TypeOrmBaseEntity';
|
|
4
4
|
export * from './entities/TypeOrmBaseUser';
|
|
5
|
+
export * from './entities/TypeOrmSettingsEntity';
|
|
6
|
+
export * from './repositories/TypeOrmSettingsRepository';
|
|
5
7
|
export * from './services/ProfileAuthService';
|
|
6
8
|
export * from './services/ProfileEmailService';
|
|
7
9
|
export * from './dto';
|
|
@@ -11,3 +13,4 @@ export * from './resolvers/createOauthResolver';
|
|
|
11
13
|
export * from './oauth';
|
|
12
14
|
export { default as createEntityDataLoader } from './utils/createEntityDataLoader';
|
|
13
15
|
export { getEncryptor, getGlobalId } from './utils/encryptor';
|
|
16
|
+
export { default as password } from './utils/password';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { DeepPartial, EntityRepository, FindConditions, In, Repository } from 'typeorm';
|
|
2
|
+
import { TypeOrmSettingsEntity } from '../entities/TypeOrmSettingsEntity';
|
|
3
|
+
|
|
4
|
+
@EntityRepository()
|
|
5
|
+
export abstract class TypeOrmSettingsRepository<
|
|
6
|
+
TEntity extends TypeOrmSettingsEntity,
|
|
7
|
+
TPayload extends Record<string, unknown>
|
|
8
|
+
> extends Repository<TEntity> {
|
|
9
|
+
private stringToBoolean(string: string): boolean {
|
|
10
|
+
switch (string.toLowerCase().trim()) {
|
|
11
|
+
case 'true':
|
|
12
|
+
case 'yes':
|
|
13
|
+
case '1':
|
|
14
|
+
return true;
|
|
15
|
+
case 'false':
|
|
16
|
+
case 'no':
|
|
17
|
+
case '0':
|
|
18
|
+
return false;
|
|
19
|
+
default:
|
|
20
|
+
return Boolean(string);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private getValue(setting: TypeOrmSettingsEntity): string | number | boolean | null {
|
|
25
|
+
if (setting.type === 'string') return setting.value;
|
|
26
|
+
if (setting.type === 'number') return Number(setting.value);
|
|
27
|
+
if (setting.type === 'boolean') return this.stringToBoolean(setting.value);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public async get(): Promise<TPayload> {
|
|
32
|
+
const settings = await this.find();
|
|
33
|
+
return settings.reduce<TPayload>(
|
|
34
|
+
(acc, setting) => ({
|
|
35
|
+
...acc,
|
|
36
|
+
[setting.key]: this.getValue(setting),
|
|
37
|
+
}),
|
|
38
|
+
{} as TPayload
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async set(data: Partial<TPayload>): Promise<TPayload> {
|
|
43
|
+
const keys = (Object.keys(data) as Array<keyof TPayload>).filter(
|
|
44
|
+
(key) => data[key] !== undefined
|
|
45
|
+
) as string[];
|
|
46
|
+
|
|
47
|
+
if (keys.length === 0) return this.get();
|
|
48
|
+
|
|
49
|
+
const condition: FindConditions<TypeOrmSettingsEntity> = { key: In(keys) };
|
|
50
|
+
await this.delete(condition as FindConditions<TEntity>);
|
|
51
|
+
|
|
52
|
+
const settings = keys.reduce<DeepPartial<TEntity>[]>((acc, key) => {
|
|
53
|
+
const value = data[key as keyof TPayload];
|
|
54
|
+
if (value === null) return acc;
|
|
55
|
+
|
|
56
|
+
const setting: DeepPartial<TEntity> = {
|
|
57
|
+
key,
|
|
58
|
+
type: typeof value,
|
|
59
|
+
value: String(value),
|
|
60
|
+
} as DeepPartial<TEntity>;
|
|
61
|
+
return [...acc, setting];
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
64
|
+
if (settings.length > 0) await this.save(settings);
|
|
65
|
+
return this.get();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import argon2 from 'argon2';
|
|
2
|
+
|
|
3
|
+
const hash = (password: string) =>
|
|
4
|
+
argon2.hash(password, {
|
|
5
|
+
type: argon2.argon2id,
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const verify = (passwordHash: string, password: string) =>
|
|
9
|
+
argon2.verify(passwordHash, password);
|
|
10
|
+
|
|
11
|
+
const password = {
|
|
12
|
+
hash,
|
|
13
|
+
verify,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default password;
|