From f368e369ea3e0e94c8c2d1fc2aacf30fd1fdfd8c Mon Sep 17 00:00:00 2001 From: Hugo van Rijswijk Date: Thu, 11 Jul 2024 16:29:27 +0200 Subject: [PATCH] Add guide alarms endpoint --- package.json | 4 +- .../migration.sql | 8 ++++ prisma/schema.prisma | 6 +++ src/graphql/gen/index.ts | 43 +++++++++++++++++++ src/graphql/resolvers/GuideAlarm.ts | 35 +++++++++++++++ src/graphql/types/GuideAlarm.ts | 24 +++++++++++ src/index.ts | 3 ++ src/prisma/queries/init/guideAlarm.ts | 19 ++++++++ src/prisma/queries/write.ts | 13 ++++++ src/typeDefs.ts | 2 + 10 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20240711084258_add_guide_alarm/migration.sql create mode 100644 src/graphql/resolvers/GuideAlarm.ts create mode 100644 src/graphql/types/GuideAlarm.ts create mode 100644 src/prisma/queries/init/guideAlarm.ts diff --git a/package.json b/package.json index 71d8e25..9ea2f35 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "index.js", "license": "MIT", "type": "module", - "packageManager": "pnpm@9.4.0", + "packageManager": "pnpm@9.5.0", "scripts": { "test": "mocha --node-option enable-source-maps --forbid-only --forbid-pending dist/**/*.spec.js", "generate": "prisma generate", @@ -15,7 +15,7 @@ "populate": "prisma migrate deploy && prisma db seed", "dev": "node --watch --enable-source-maps ./dist/index.js", "codegen": "graphql-codegen --config tasks/codegen.ts", - "codegen:watch": "pnpm codegen --watch 'src/graphql/types/*.ts'", + "codegen:watch": "pnpm codegen --watch 'src/graphql/*.ts'", "lint": "pnpm lint:prettier && pnpm lint:eslint", "lint:prettier": "prettier --check .", "lint:eslint": "eslint .", diff --git a/prisma/migrations/20240711084258_add_guide_alarm/migration.sql b/prisma/migrations/20240711084258_add_guide_alarm/migration.sql new file mode 100644 index 0000000..f23d5be --- /dev/null +++ b/prisma/migrations/20240711084258_add_guide_alarm/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "GuideAlarm" ( + "wfs" "WfsType" NOT NULL, + "limit" INTEGER NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "GuideAlarm_pkey" PRIMARY KEY ("wfs") +); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 232c556..a78c05f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -218,6 +218,12 @@ model GemsGuideLoop { flexure Boolean } +model GuideAlarm { + wfs WfsType @id + limit Int + enabled Boolean @default(true) +} + // model pwfs1 { // pk Int @id @default(autoincrement()) // filter String diff --git a/src/graphql/gen/index.ts b/src/graphql/gen/index.ts index a1b8583..95a8aaa 100644 --- a/src/graphql/gen/index.ts +++ b/src/graphql/gen/index.ts @@ -110,6 +110,19 @@ export type GemsInstrument = { pk: Scalars['Int']['output']; }; +export type GuideAlarm = { + __typename?: 'GuideAlarm'; + enabled: Scalars['Boolean']['output']; + limit: Scalars['Int']['output']; +}; + +export type GuideAlarms = { + __typename?: 'GuideAlarms'; + OIWFS: GuideAlarm; + PWFS1: GuideAlarm; + PWFS2: GuideAlarm; +}; + export type GuideLoop = { __typename?: 'GuideLoop'; daytimeMode: Scalars['Boolean']['output']; @@ -198,6 +211,7 @@ export type Mutation = { updateConfiguration: Configuration; updateGemsGuideLoop: GemsGuideLoop; updateGemsInstrument: GemsInstrument; + updateGuideAlarm: GuideAlarm; updateGuideLoop: GuideLoop; updateMechanism: Mechanism; updateRotator: Rotator; @@ -327,6 +341,13 @@ export type MutationUpdateGemsInstrumentArgs = { }; +export type MutationUpdateGuideAlarmArgs = { + enabled?: InputMaybe; + limit?: InputMaybe; + wfs: WfsType; +}; + + export type MutationUpdateGuideLoopArgs = { daytimeMode?: InputMaybe; lightPath?: InputMaybe; @@ -432,6 +453,7 @@ export type Query = { distinctPorts: Array; gemsGuideLoop?: Maybe; gemsInstrument?: Maybe; + guideAlarms: GuideAlarms; guideLoop?: Maybe; instrument?: Maybe; instruments: Array; @@ -662,6 +684,8 @@ export type ResolversTypes = { Float: ResolverTypeWrapper; GemsGuideLoop: ResolverTypeWrapper; GemsInstrument: ResolverTypeWrapper; + GuideAlarm: ResolverTypeWrapper; + GuideAlarms: ResolverTypeWrapper; GuideLoop: ResolverTypeWrapper; GuidingType: GuidingType; Instrument: ResolverTypeWrapper; @@ -699,6 +723,8 @@ export type ResolversParentTypes = { Float: Scalars['Float']['output']; GemsGuideLoop: GemsGuideLoop; GemsInstrument: GemsInstrument; + GuideAlarm: GuideAlarm; + GuideAlarms: GuideAlarms; GuideLoop: GuideLoop; Instrument: Instrument; Int: Scalars['Int']['output']; @@ -811,6 +837,19 @@ export type GemsInstrumentResolvers; }; +export type GuideAlarmResolvers = { + enabled?: Resolver; + limit?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GuideAlarmsResolvers = { + OIWFS?: Resolver; + PWFS1?: Resolver; + PWFS2?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type GuideLoopResolvers = { daytimeMode?: Resolver; lightPath?: Resolver; @@ -899,6 +938,7 @@ export type MutationResolvers>; updateGemsGuideLoop?: Resolver>; updateGemsInstrument?: Resolver>; + updateGuideAlarm?: Resolver>; updateGuideLoop?: Resolver>; updateMechanism?: Resolver>; updateRotator?: Resolver>; @@ -914,6 +954,7 @@ export type QueryResolvers, ParentType, ContextType, Partial>; gemsGuideLoop?: Resolver, ParentType, ContextType>; gemsInstrument?: Resolver, ParentType, ContextType>; + guideAlarms?: Resolver; guideLoop?: Resolver, ParentType, ContextType>; instrument?: Resolver, ParentType, ContextType, Partial>; instruments?: Resolver, ParentType, ContextType, Partial>; @@ -992,6 +1033,8 @@ export type Resolvers = { El?: ElResolvers; GemsGuideLoop?: GemsGuideLoopResolvers; GemsInstrument?: GemsInstrumentResolvers; + GuideAlarm?: GuideAlarmResolvers; + GuideAlarms?: GuideAlarmsResolvers; GuideLoop?: GuideLoopResolvers; Instrument?: InstrumentResolvers; JSON?: GraphQLScalarType; diff --git a/src/graphql/resolvers/GuideAlarm.ts b/src/graphql/resolvers/GuideAlarm.ts new file mode 100644 index 0000000..47fd8d2 --- /dev/null +++ b/src/graphql/resolvers/GuideAlarm.ts @@ -0,0 +1,35 @@ +import { GuideAlarm } from '@prisma/client'; +import { FieldNode } from 'graphql'; +import { prisma } from '../../prisma/db.js'; +import { Resolvers, WfsType } from '../gen/index.js'; + +export const GuideAlarmResolver: Resolvers = { + Query: { + async guideAlarms(_parent, _args, _context, info) { + // Get the wfs types to query for from the graphql info object + const wfsTypesToQuery = + ((info.fieldNodes[0]?.selectionSet?.selections as FieldNode[]) + .map((selection) => selection.name.value) + .filter((wfs) => wfs !== '__typename') as WfsType[]) ?? []; + + const alarms = await prisma.guideAlarm.findMany({ + where: { + wfs: { + in: wfsTypesToQuery, + }, + }, + }); + + // Convert the array of alarms to an object with the wfs as the key + return Object.fromEntries(alarms.map((alarm) => [alarm.wfs, alarm])) as Record; + }, + }, + Mutation: { + updateGuideAlarm(_parent, args) { + return prisma.guideAlarm.update({ + where: { wfs: args.wfs }, + data: args, + }); + }, + }, +}; diff --git a/src/graphql/types/GuideAlarm.ts b/src/graphql/types/GuideAlarm.ts new file mode 100644 index 0000000..c7dd4f4 --- /dev/null +++ b/src/graphql/types/GuideAlarm.ts @@ -0,0 +1,24 @@ +export const GuideAlarmTypeDefs = `#graphql +type GuideAlarm { + limit: Int! + enabled: Boolean! +} + +type GuideAlarms { + OIWFS: GuideAlarm! + PWFS1: GuideAlarm! + PWFS2: GuideAlarm! +} + +type Query { + guideAlarms: GuideAlarms! +} + +type Mutation { + updateGuideAlarm( + wfs: WfsType! + limit: Int + enabled: Boolean + ): GuideAlarm! +} +`; diff --git a/src/index.ts b/src/index.ts index 5693081..483b3be 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,6 +19,7 @@ import { UserResolver } from './graphql/resolvers/User.js'; // TypeDefs import { DateTimeResolver, JSONResolver } from 'graphql-scalars'; import { typeDefs } from './typeDefs.js'; +import { GuideAlarmResolver } from './graphql/resolvers/GuideAlarm.js'; // Resolvers define how to fetch the types defined in your schema. const resolvers = { @@ -37,6 +38,7 @@ const resolvers = { ...SlewFlagsResolver.Query, ...TargetResolver.Query, ...UserResolver.Query, + ...GuideAlarmResolver.Query, }, Mutation: { ...AltairGuideLoopResolver.Mutation, @@ -51,6 +53,7 @@ const resolvers = { ...SlewFlagsResolver.Mutation, ...TargetResolver.Mutation, ...UserResolver.Mutation, + ...GuideAlarmResolver.Mutation, }, }; diff --git a/src/prisma/queries/init/guideAlarm.ts b/src/prisma/queries/init/guideAlarm.ts new file mode 100644 index 0000000..74ba196 --- /dev/null +++ b/src/prisma/queries/init/guideAlarm.ts @@ -0,0 +1,19 @@ +import { Prisma } from '@prisma/client'; + +export const INITIAL_GUIDE_ALARMS: Prisma.GuideAlarmCreateInput[] = [ + { + wfs: 'PWFS1', + limit: 900, + enabled: true, + }, + { + wfs: 'PWFS2', + limit: 900, + enabled: true, + }, + { + wfs: 'OIWFS', + limit: 900, + enabled: true, + }, +]; diff --git a/src/prisma/queries/write.ts b/src/prisma/queries/write.ts index 8c598ff..85ab1f7 100644 --- a/src/prisma/queries/write.ts +++ b/src/prisma/queries/write.ts @@ -6,6 +6,7 @@ import { INITIAL_MECHANISM } from './init/mechanism.js'; import { INITIAL_ROTATOR } from './init/rotator.js'; import { INITIAL_SLEW_FLAGS } from './init/slewFlags.js'; import { INITIAL_USERS } from './init/users.js'; +import { INITIAL_GUIDE_ALARMS } from './init/guideAlarm.js'; async function createUsers() { console.log('Creating user reader'); @@ -72,6 +73,17 @@ async function createMechanism() { }); } +async function createGuideAlarms() { + console.log('Creating guide alarms'); + for (const guideAlarm of INITIAL_GUIDE_ALARMS) { + await prisma.guideAlarm.upsert({ + where: { wfs: guideAlarm.wfs }, + update: guideAlarm, + create: guideAlarm, + }); + } +} + export async function write() { await createUsers(); await createInstruments(); @@ -80,4 +92,5 @@ export async function write() { await createConfiguration(); await createGuideLoopInfo(); await createMechanism(); + await createGuideAlarms(); } diff --git a/src/typeDefs.ts b/src/typeDefs.ts index f97296b..82e9c3b 100644 --- a/src/typeDefs.ts +++ b/src/typeDefs.ts @@ -10,6 +10,7 @@ import { RotatorTypeDefs } from './graphql/types/Rotator.js'; import { SlewFlagsTypeDefs } from './graphql/types/SlewFlags.js'; import { TargetTypeDefs } from './graphql/types/Target.js'; import { UserTypeDefs } from './graphql/types/User.js'; +import { GuideAlarmTypeDefs } from './graphql/types/GuideAlarm.js'; import { DateTimeTypeDefinition, JSONDefinition } from 'graphql-scalars'; export const typeDefs = [ @@ -27,4 +28,5 @@ export const typeDefs = [ SlewFlagsTypeDefs, TargetTypeDefs, UserTypeDefs, + GuideAlarmTypeDefs, ];