import {Injectable} from '@nestjs/common'; import {RedisService} from 'nestjs-redis'; import {LogData} from '../models/data.model'; @Injectable() export class DbService { constructor(private readonly redisService: RedisService) { } private get redis() { return this.redisService.getClient(); } setDevice(id: string, deviceId: string) { return this.redis.set(`devices:${id}`, deviceId); } getDevice(id: string) { return this.redis.get(`devices:${id}`); } deleteDevice(id: string) { return this.redis.del(`devices:${id}`); } create(key: string, value: any) { return this.redis.set(key, JSON.stringify(value)); } add(id, key, log: LogData) { return this.redis.multi().set(id, JSON.stringify({ ...log.metadata, time: log.time })).zadd('errors', String(0), id).hset(`${id}:errors`, key, JSON.stringify({ ...log.error, time: log.time })).exec(); } async complete(id: string, payload?: any) { const device = await this.redis.get(id).then(data => JSON.parse(data)); const logs = await this.logs(id).then(l => Object.entries(l).map(([key, value]) => ({type: key, ...JSON.parse(String(value))}))); const deviceId = await this.getDevice(id); return this.delete(id).then(() => { return this.redis.zadd(`completed`, 0, JSON.stringify({...device, logs, deviceId})); }); } async get() { const ids: string[] = await this.redis.zrange('errors', 0, -1); if (ids.length) { return this.redis.mget(...ids); } return []; } async completed() { const data = await this.redis.zrange('completed', 0, -1); return data.map(record => JSON.parse(record)); } async logs(id: string) { return this.redis.hgetall(`${id}:errors`); } async delete(id: string) { const errors = await this.redis.hkeys(`${id}:errors`); await this.redis.multi({pipeline: false}); await this.redis.del(id); await this.redis.zrem('errors', id); await this.deleteDevice(id); errors.forEach((key) => this.redis.hdel(`${id}:errors`, key)); await this.redis.exec(); } }