This commit is contained in:
Ben Wilson
2023-06-24 12:54:13 -04:00
parent 080471e52d
commit f61e9f1417
10 changed files with 115 additions and 53 deletions
@@ -1,13 +1,22 @@
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { ClientEntity } from '../client/client.entity';
import { TrackedEntity } from '../utils/TrackedEntity.entity';
@Entity()
export class ClientStatisticsEntity {
export class ClientStatisticsEntity extends TrackedEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 62, type: 'varchar' })
address: string;
@Column()
clientName: string;
@Column({ length: 8, type: 'varchar' })
sessionId: string;
@Column({ type: 'datetime' })
time: Date;
@@ -15,10 +24,6 @@ export class ClientStatisticsEntity {
difficulty: number;
@ManyToOne(
() => ClientEntity,
client => client.clientStatistics
)
client: ClientEntity;
}
@@ -19,19 +19,19 @@ export class ClientStatisticsService {
return await this.clientStatisticsRepository.save(clientStatistic);
}
public async getHashRate(clientId: string) {
public async getHashRate(sessionId: string) {
const query = `
SELECT
(JULIANDAY(MAX(entry.time)) - JULIANDAY(MIN(entry.time))) * 24 * 60 * 60 AS timeDiff,
SUM(entry.difficulty) AS difficultySum
FROM
client_statistics_entity AS entry
WHERE
entry.clientId = ?
FROM
client_statistics_entity AS entry
WHERE
entry.sessionId = ? AND entry.time > datetime("now", "-1 hour")
`;
const result = await this.clientStatisticsRepository.query(query, [clientId]);
const result = await this.clientStatisticsRepository.query(query, [sessionId]);
const timeDiff = result[0].timeDiff;
const difficultySum = result[0].difficultySum;
@@ -39,4 +39,32 @@ export class ClientStatisticsService {
return (difficultySum * 4294967296) / (timeDiff * 1000000000);
}
public async getChartData(sessionId: string) {
const query = `
WITH result_set AS (
SELECT
MAX(time) AS label,
(SUM(difficulty) * 4294967296) /
((JULIANDAY(MAX(time)) - JULIANDAY(MIN(time))) * 24 * 60 * 60 * 1000000000) AS data
FROM
client_statistics_entity AS entry
WHERE
entry.sessionId = ? AND entry.time > datetime("now", "-1 day")
GROUP BY
strftime('%Y-%m-%d %H', time, 'localtime') || (strftime('%M', time, 'localtime') / 5)
)
SELECT *
FROM result_set
WHERE label <> (SELECT MAX(Label) FROM result_set);
`;
const result = await this.clientStatisticsRepository.query(query, [sessionId]);
return result;
}
public async deleteAll() {
return await this.clientStatisticsRepository.delete({})
}
}
+17 -14
View File
@@ -1,29 +1,32 @@
import { Column, Entity, OneToMany, PrimaryColumn } from 'typeorm';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { ClientStatisticsEntity } from '../client-statistics/client-statistics.entity';
import { TrackedEntity } from '../utils/TrackedEntity.entity';
@Entity()
export class ClientEntity extends TrackedEntity {
@PrimaryColumn({ length: 8, type: 'varchar' })
id: string;
@Column({ type: 'datetime' })
startTime: Date;
@PrimaryGeneratedColumn()
id: number;
@Column()
clientName: string;
@Column({ length: 62, type: 'varchar' })
address: string;
@Column()
clientName: string;
@Column({ length: 8, type: 'varchar' })
sessionId: string;
@Column({ type: 'datetime' })
startTime: Date;
@Column({ default: 0 })
bestDifficulty: number
@OneToMany(
() => ClientStatisticsEntity,
clientStatistic => clientStatistic.client
)
clientStatistics?: ClientStatisticsEntity[];
}
}
+11 -6
View File
@@ -21,12 +21,12 @@ export class ClientService {
return await this.clientRepository.save(client);
}
public async delete(id: string) {
return await this.clientRepository.softDelete({ id });
public async delete(sessionId: string) {
return await this.clientRepository.softDelete({ sessionId });
}
public async updateBestDifficulty(id: string, bestDifficulty: number) {
return await this.clientRepository.update(id, { bestDifficulty });
public async updateBestDifficulty(sessionId: string, bestDifficulty: number) {
return await this.clientRepository.update({ sessionId }, { bestDifficulty });
}
public async connectedClientCount(): Promise<number> {
return await this.clientRepository.count();
@@ -40,12 +40,17 @@ export class ClientService {
})
}
public async getByAddressAndName(address: string, id: string): Promise<ClientEntity> {
public async getById(address: string, clientName: string, sessionId: string): Promise<ClientEntity> {
return await this.clientRepository.findOne({
where: {
address,
id
clientName,
sessionId
}
})
}
public async deleteAll() {
return await this.clientRepository.softDelete({})
}
}