Skip to content

Commit

Permalink
Merge branch 'soeren/fix-validators' of https://github.com/nimiq/vali…
Browse files Browse the repository at this point in the history
…dators-api into onmax/reliability-null
  • Loading branch information
onmax committed Nov 22, 2024
2 parents e6bf3e9 + f3fd186 commit 818ef85
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 43 deletions.
21 changes: 20 additions & 1 deletion server/database/schema.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { sql } from 'drizzle-orm'
import { relations, sql } from 'drizzle-orm'
import { check, index, integer, primaryKey, real, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'
import { PayoutType } from '../utils/types'

Expand All @@ -24,6 +24,11 @@ export const validators = sqliteTable('validators', {
),
}))

export const validatorRelations = relations(validators, ({ many }) => ({
scores: many(scores),

Check failure on line 28 in server/database/schema.ts

View workflow job for this annotation

GitHub Actions / lint

'scores' was used before it was defined
activity: many(activity),

Check failure on line 29 in server/database/schema.ts

View workflow job for this annotation

GitHub Actions / lint

'activity' was used before it was defined
}))

// The scores only for the default window dominance
export const scores = sqliteTable('scores', {
validatorId: integer('validator_id').notNull().references(() => validators.id, { onDelete: 'cascade' }),
Expand All @@ -38,6 +43,13 @@ export const scores = sqliteTable('scores', {
compositePrimaryKey: primaryKey({ columns: [table.validatorId, table.epochNumber] }),
}))

export const scoresRelations = relations(scores, ({ one }) => ({
validator: one(validators, {
fields: [scores.validatorId],
references: [validators.id],
}),
}))

export const activity = sqliteTable('activity', {
validatorId: integer('validator_id').notNull().references(() => validators.id, { onDelete: 'cascade' }),
epochNumber: integer('epoch_number').notNull(),
Expand All @@ -51,3 +63,10 @@ export const activity = sqliteTable('activity', {
idxElectionBlock: index('idx_election_block').on(table.epochNumber),
compositePrimaryKey: primaryKey({ columns: [table.validatorId, table.epochNumber] }),
}))

export const activityRelations = relations(activity, ({ one }) => ({
validator: one(validators, {
fields: [activity.validatorId],
references: [validators.id],
}),
}))
76 changes: 34 additions & 42 deletions server/utils/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,49 +142,41 @@ export async function fetchValidators(params: FetchValidatorsOptions): Result<Fe
filters.push(sql`lower(${tables.validators.name}) NOT LIKE lower('%Unknown validator%')`)

try {
const validators = await useDrizzle()
.select({
id: tables.validators.id,
name: tables.validators.name,
address: tables.validators.address,
description: tables.validators.description,
fee: tables.validators.fee,
payoutType: tables.validators.payoutType,
payoutSchedule: tables.validators.payoutSchedule,
isMaintainedByNimiq: tables.validators.isMaintainedByNimiq,
website: tables.validators.website,
logo: tables.validators.logo,
logoPath: tables.validators.logo,
hasDefaultLogo: tables.validators.hasDefaultLogo,
accentColor: tables.validators.accentColor,
dominanceRatioViaBalance: tables.activity.dominanceRatioViaBalance,
dominanceRatioViaSlots: tables.activity.dominanceRatioViaSlots,
score: {
total: tables.scores.total,
availability: tables.scores.availability,
reliability: tables.scores.reliability,
dominance: tables.scores.dominance,
const dbValidators = await useDrizzle().query.validators.findMany({
where: and(...filters),
with: {
scores: {
where: eq(tables.scores.epochNumber, epochNumber),
columns: {
total: true,
availability: true,
dominance: true,
reliability: true,
},
},
})
.from(tables.validators)
.where(and(...filters))
.leftJoin(
tables.scores,
and(
eq(tables.validators.id, tables.scores.validatorId),
eq(tables.scores.epochNumber, epochNumber),
isNotNull(tables.scores.total),
),
)
.leftJoin(
tables.activity,
and(
eq(tables.validators.id, tables.activity.validatorId),
eq(tables.activity.epochNumber, epochNumber),
),
)
// .orderBy(desc(tables.scores.total))
.all() as FetchedValidator[]
activity: {
where: eq(tables.scores.epochNumber, epochNumber),
columns: {
dominanceRatioViaBalance: true,
dominanceRatioViaSlots: true,
},
orderBy: desc(tables.activity.likelihood),
limit: 1,
},
},
})

const validators = dbValidators.map((validator) => {
const {scores, logo, contact, activity, ...rest} = validator

Check failure on line 170 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

Expected indentation of 6 spaces but found 5

Check failure on line 170 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

A space is required after '{'

Check failure on line 170 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

A space is required before '}'

Check failure on line 170 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

Multiple spaces found before '='

return {

Check failure on line 172 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

Expected indentation of 6 spaces but found 5
...rest,

Check failure on line 173 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

Expected indentation of 8 spaces but found 6
score: scores[0] || null,

Check failure on line 174 in server/utils/validators.ts

View workflow job for this annotation

GitHub Actions / lint

Expected indentation of 8 spaces but found 6
logo,
dominanceRatioViaBalance: activity[0]?.dominanceRatioViaBalance,
dominanceRatioViaSlots: activity[0]?.dominanceRatioViaSlots,
} as FetchedValidator
})

if (!withIdenticons)
validators.filter(v => v.hasDefaultLogo).forEach(v => delete v.logo)
Expand Down

0 comments on commit 818ef85

Please sign in to comment.