Files
automatisch/packages/backend/src/models/app-auth-client.js

84 lines
2.1 KiB
JavaScript

import AES from 'crypto-js/aes.js';
import enc from 'crypto-js/enc-utf8.js';
import appConfig from '../config/app.js';
import AppConfig from './app-config.js';
import Base from './base.js';
class AppAuthClient extends Base {
static tableName = 'app_auth_clients';
static jsonSchema = {
type: 'object',
required: ['name', 'appKey', 'formattedAuthDefaults'],
properties: {
id: { type: 'string', format: 'uuid' },
appKey: { type: 'string' },
active: { type: 'boolean' },
authDefaults: { type: ['string', 'null'] },
formattedAuthDefaults: { type: 'object' },
createdAt: { type: 'string' },
updatedAt: { type: 'string' },
},
};
encryptData() {
if (!this.eligibleForEncryption()) return;
this.authDefaults = AES.encrypt(
JSON.stringify(this.formattedAuthDefaults),
appConfig.encryptionKey
).toString();
delete this.formattedAuthDefaults;
}
decryptData() {
if (!this.eligibleForDecryption()) return;
this.formattedAuthDefaults = JSON.parse(
AES.decrypt(this.authDefaults, appConfig.encryptionKey).toString(enc)
);
}
eligibleForEncryption() {
return this.formattedAuthDefaults ? true : false;
}
eligibleForDecryption() {
return this.authDefaults ? true : false;
}
// TODO: Make another abstraction like beforeSave instead of using
// beforeInsert and beforeUpdate separately for the same operation.
async $beforeInsert(queryContext) {
await super.$beforeInsert(queryContext);
this.encryptData();
}
async $beforeUpdate(opt, queryContext) {
await super.$beforeUpdate(opt, queryContext);
this.encryptData();
}
async assignCanConnectForAppConfig() {
const appConfig = await AppConfig.query().findOne({ key: this.appKey });
await appConfig?.assignCanConnect();
}
async $afterInsert(queryContext) {
await super.$afterInsert(queryContext);
await this.assignCanConnectForAppConfig();
}
async $afterUpdate(opt, queryContext) {
await super.$afterUpdate(opt, queryContext);
await this.assignCanConnectForAppConfig();
}
async $afterFind() {
this.decryptData();
}
}
export default AppAuthClient;