Skip to content

Commit e37cc77

Browse files
authored
Merge pull request #4189 from RedisInsight/be/feature/RI-5114-inform-cloud-dbs
#RI-5114 - add createdAt for db
2 parents 6ac5361 + 2aa8ff0 commit e37cc77

File tree

11 files changed

+46
-6
lines changed

11 files changed

+46
-6
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class DatabaseCreatedAt1733740794737 implements MigrationInterface {
4+
name = 'DatabaseCreatedAt1733740794737'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`CREATE TABLE "temporary_database_instance" ("id" varchar PRIMARY KEY NOT NULL, "host" varchar NOT NULL, "port" integer NOT NULL, "name" varchar NOT NULL, "username" varchar, "password" varchar, "tls" boolean, "verifyServerCert" boolean, "lastConnection" datetime, "caCertId" varchar, "clientCertId" varchar, "connectionType" varchar NOT NULL DEFAULT ('STANDALONE'), "nodes" varchar DEFAULT ('[]'), "nameFromProvider" varchar, "sentinelMasterName" varchar, "sentinelMasterUsername" varchar, "sentinelMasterPassword" varchar, "provider" varchar DEFAULT ('UNKNOWN'), "modules" varchar NOT NULL DEFAULT ('[]'), "db" integer, "encryption" varchar, "tlsServername" varchar, "new" boolean, "ssh" boolean, "timeout" integer, "compressor" varchar NOT NULL DEFAULT ('NONE'), "version" varchar, "createdAt" datetime DEFAULT (datetime('now')), CONSTRAINT "FK_d1bc747b5938e22b4b708d8e9a5" FOREIGN KEY ("caCertId") REFERENCES "ca_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_3b9b625266c00feb2d66a9f36e4" FOREIGN KEY ("clientCertId") REFERENCES "client_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION)`);
8+
await queryRunner.query(`INSERT INTO "temporary_database_instance"("id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername", "new", "ssh", "timeout", "compressor", "version") SELECT "id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername", "new", "ssh", "timeout", "compressor", "version" FROM "database_instance"`);
9+
await queryRunner.query(`DROP TABLE "database_instance"`);
10+
await queryRunner.query(`ALTER TABLE "temporary_database_instance" RENAME TO "database_instance"`);
11+
}
12+
13+
public async down(queryRunner: QueryRunner): Promise<void> {
14+
await queryRunner.query(`ALTER TABLE "database_instance" RENAME TO "temporary_database_instance"`);
15+
await queryRunner.query(`CREATE TABLE "database_instance" ("id" varchar PRIMARY KEY NOT NULL, "host" varchar NOT NULL, "port" integer NOT NULL, "name" varchar NOT NULL, "username" varchar, "password" varchar, "tls" boolean, "verifyServerCert" boolean, "lastConnection" datetime, "caCertId" varchar, "clientCertId" varchar, "connectionType" varchar NOT NULL DEFAULT ('STANDALONE'), "nodes" varchar DEFAULT ('[]'), "nameFromProvider" varchar, "sentinelMasterName" varchar, "sentinelMasterUsername" varchar, "sentinelMasterPassword" varchar, "provider" varchar DEFAULT ('UNKNOWN'), "modules" varchar NOT NULL DEFAULT ('[]'), "db" integer, "encryption" varchar, "tlsServername" varchar, "new" boolean, "ssh" boolean, "timeout" integer, "compressor" varchar NOT NULL DEFAULT ('NONE'), "version" varchar, CONSTRAINT "FK_d1bc747b5938e22b4b708d8e9a5" FOREIGN KEY ("caCertId") REFERENCES "ca_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_3b9b625266c00feb2d66a9f36e4" FOREIGN KEY ("clientCertId") REFERENCES "client_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION)`);
16+
await queryRunner.query(`INSERT INTO "database_instance"("id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername", "new", "ssh", "timeout", "compressor", "version") SELECT "id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername", "new", "ssh", "timeout", "compressor", "version" FROM "temporary_database_instance"`);
17+
await queryRunner.query(`DROP TABLE "temporary_database_instance"`);
18+
}
19+
20+
}

redisinsight/api/migration/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { Rdi1716370509836 } from './1716370509836-rdi';
4444
import { AiHistory1718260230164 } from './1718260230164-ai-history';
4545
import { CloudSession1729085495444 } from './1729085495444-cloud-session';
4646
import { CommandExecution1726058563737 } from './1726058563737-command-execution';
47+
import { DatabaseCreatedAt1733740794737 } from './1733740794737-database-createdAt';
4748

4849
export default [
4950
initialMigration1614164490968,
@@ -92,4 +93,5 @@ export default [
9293
AiHistory1718260230164,
9394
CloudSession1729085495444,
9495
CommandExecution1726058563737,
96+
DatabaseCreatedAt1733740794737,
9597
];

redisinsight/api/src/modules/database/database.service.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,8 @@ describe('DatabaseService', () => {
530530
mockSessionMetadata,
531531
omit({ ...mockDatabase, username: 'new-name', timeout: 40_000 }, ['sshOptions.id']),
532532
);
533+
expect(databaseRepository.get)
534+
.toHaveBeenCalledWith(mockSessionMetadata, mockDatabase.id, false, ['id', 'sshOptions.id', 'createdAt']);
533535
});
534536

535537
it('should create new database with merged ssh options', async () => {

redisinsight/api/src/modules/database/database.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ export class DatabaseService {
294294
public async clone(sessionMetadata: SessionMetadata, id: string, dto: UpdateDatabaseDto): Promise<Database> {
295295
this.logger.log('Clone existing database');
296296
const database = await this.merge(
297-
await this.get(sessionMetadata, id, false, ['id', 'sshOptions.id']),
297+
await this.get(sessionMetadata, id, false, ['id', 'sshOptions.id', 'createdAt']),
298298
dto,
299299
);
300300
if (DatabaseService.isConnectionAffected(dto)) {

redisinsight/api/src/modules/database/entities/database.entity.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
Column, Entity, ManyToOne, OneToOne, PrimaryGeneratedColumn,
2+
Column, CreateDateColumn, Entity, ManyToOne, OneToOne, PrimaryGeneratedColumn,
33
} from 'typeorm';
44
import { CaCertificateEntity } from 'src/modules/certificate/entities/ca-certificate.entity';
55
import { ClientCertificateEntity } from 'src/modules/certificate/entities/client-certificate.entity';
@@ -172,6 +172,12 @@ export class DatabaseEntity {
172172
@Column({ type: 'datetime', nullable: true })
173173
lastConnection: Date;
174174

175+
@CreateDateColumn({
176+
nullable: true,
177+
})
178+
@Expose()
179+
createdAt: Date;
180+
175181
@Expose()
176182
@Column({
177183
nullable: true,
@@ -231,4 +237,4 @@ export class DatabaseEntity {
231237
@Expose()
232238
@Column({ nullable: true })
233239
version: string;
234-
}
240+
}

redisinsight/api/src/modules/database/models/database.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ export class Database {
146146
@Expose()
147147
lastConnection: Date;
148148

149+
@ApiProperty({
150+
description: 'Date of creation',
151+
type: Date,
152+
})
153+
@Expose()
154+
createdAt?: Date;
155+
149156
@ApiPropertyOptional({
150157
description: 'Redis OSS Sentinel master group.',
151158
type: SentinelMaster,

redisinsight/api/src/modules/database/repositories/local.database.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export class LocalDatabaseRepository extends DatabaseRepository {
9696
.select([
9797
'd.id', 'd.name', 'd.host', 'd.port', 'd.db', 'd.new', 'd.timeout',
9898
'd.connectionType', 'd.modules', 'd.lastConnection', 'd.provider', 'd.version', 'cd',
99+
'd.createdAt',
99100
])
100101
.getMany();
101102

@@ -262,4 +263,4 @@ export class LocalDatabaseRepository extends DatabaseRepository {
262263
}
263264
}
264265
}
265-
}
266+
}

redisinsight/api/test/api/database/GET-databases.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const responseSchema = Joi.array().items(Joi.object().keys({
1717
compressor: Joi.string().valid('NONE', 'LZ4', 'GZIP', 'ZSTD', 'SNAPPY').allow(null),
1818
connectionType: Joi.string().valid('STANDALONE', 'SENTINEL', 'CLUSTER', 'NOT CONNECTED').required(),
1919
lastConnection: Joi.string().isoDate().allow(null).required(),
20+
createdAt: Joi.string().isoDate(),
2021
version: Joi.string().allow(null).required(),
2122
modules: Joi.array().items(Joi.object().keys({
2223
name: Joi.string().required(),

redisinsight/api/test/api/database/PATCH-databases-id.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ describe(`PATCH /databases/:id`, () => {
233233
after: async () => {
234234
newDatabase = await localDb.getInstanceById(constants.TEST_INSTANCE_ID_3);
235235
expect(newDatabase).to.contain({
236-
..._.omit(oldDatabase, ['modules', 'provider', 'lastConnection', 'new', 'timeout', 'compressor', 'version']),
236+
..._.omit(oldDatabase, ['modules', 'provider', 'lastConnection', 'new', 'timeout', 'compressor', 'version', 'createdAt']),
237237
host: constants.TEST_REDIS_HOST,
238238
port: constants.TEST_REDIS_PORT,
239239
});

redisinsight/api/test/api/database/POST-databases-clone-id.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ describe(`POST /databases/clone/:id`, () => {
161161
after: async () => {
162162
newDatabase = await localDb.getInstanceByName('some name');
163163
expect(newDatabase).to.contain({
164-
..._.omit(oldDatabase, ['id', 'modules', 'name', 'provider', 'lastConnection', 'new', 'timeout', 'compressor', 'version']),
164+
..._.omit(oldDatabase, ['id', 'modules', 'name', 'provider', 'lastConnection', 'new', 'timeout', 'compressor', 'version', 'createdAt']),
165165
host: constants.TEST_REDIS_HOST,
166166
port: constants.TEST_REDIS_PORT,
167167
});

0 commit comments

Comments
 (0)