diff --git a/schemas/discriminated.json b/schemas/discriminated.json index 29649659..32f6d0ff 100644 --- a/schemas/discriminated.json +++ b/schemas/discriminated.json @@ -13,6 +13,155 @@ } ], "definitions": { + "Application<\"pa\">": { + "additionalProperties": false, + "properties": { + "applicationType": { + "$ref": "#/definitions/ApplicationTypeKeys", + "description": "Enforces an application type which matches the given primary type" + } + }, + "required": [ + "applicationType" + ], + "type": "object" + }, + "Application<\"pp\">": { + "additionalProperties": false, + "properties": { + "applicationType": { + "$ref": "#/definitions/ApplicationTypeKeys", + "description": "Enforces an application type which matches the given primary type" + } + }, + "required": [ + "applicationType" + ], + "type": "object" + }, + "Application<\"wtt\">": { + "additionalProperties": false, + "properties": { + "applicationType": { + "$ref": "#/definitions/ApplicationTypeKeys", + "description": "Enforces an application type which matches the given primary type" + } + }, + "required": [ + "applicationType" + ], + "type": "object" + }, + "ApplicationTypeKeys": { + "enum": [ + "advertConsent", + "amendment", + "amendment.minorMaterial", + "amendment.nonMaterial", + "approval", + "approval.conditions", + "approval.reservedMatters", + "complianceConfirmation", + "environmentalImpact", + "environmentalImpact.scoping", + "environmentalImpact.screening", + "hazardousSubstanceConsent", + "hedgerowRemovalNotice", + "landDrainageConsent", + "ldc", + "ldc.breachOfCondition", + "ldc.existing", + "ldc.listedBuildingWorks", + "ldc.proposed", + "listed", + "notifyCompletion", + "obligation", + "obligation.discharge", + "obligation.modify", + "onshoreExtractionOilAndGas", + "onshoreExtractionOilAndGas.other", + "onshoreExtractionOilAndGas.pp.extension", + "onshoreExtractionOilAndGas.pp.waste", + "onshoreExtractionOilAndGas.pp.working", + "onshoreExtractionOilAndGas.review", + "onshoreExtractionOilAndGas.variation", + "pa", + "pa.part1.classA", + "pa.part1.classAA", + "pa.part3.classG", + "pa.part3.classM", + "pa.part3.classMA", + "pa.part3.classN", + "pa.part3.classQ", + "pa.part3.classR", + "pa.part3.classS", + "pa.part3.classT", + "pa.part3.classV", + "pa.part4.classBB", + "pa.part4.classBC", + "pa.part4.classCA", + "pa.part4.classE", + "pa.part6", + "pa.part6.classA", + "pa.part6.classB", + "pa.part6.classE", + "pa.part7.classC", + "pa.part7.classM", + "pa.part9.classD", + "pa.part11.classB", + "pa.part14.classA", + "pa.part14.classB", + "pa.part14.classJ", + "pa.part14.classK", + "pa.part14.classOA", + "pa.part16.classA", + "pa.part17", + "pa.part17.classB", + "pa.part17.classC", + "pa.part17.classG", + "pa.part18.classA", + "pa.part19.classTA", + "pa.part20.classA", + "pa.part20.classAA", + "pa.part20.classAB", + "pa.part20.classAC", + "pa.part20.classAD", + "pa.part20.classZA", + "pp", + "pp.full", + "pp.full.advertConsent", + "pp.full.demolition", + "pp.full.fastTrack.affordable", + "pp.full.householder", + "pp.full.householder.listed", + "pp.full.householder.retro", + "pp.full.major", + "pp.full.major.technicalDetails", + "pp.full.major.technicalDetails.waste", + "pp.full.major.waste", + "pp.full.minor", + "pp.full.minor.listed", + "pp.full.minor.technicalDetails", + "pp.mineralExtraction", + "pp.outline", + "pp.outline.all", + "pp.outline.some", + "pp.outline.minor", + "pp.outline.minor.all", + "pp.outline.minor.some", + "pp.outline.major", + "pp.outline.major.all", + "pp.outline.major.all.waste", + "pp.outline.major.some", + "pp.outline.major.some.waste", + "pp.pip", + "rightsOfWayOrder", + "wtt", + "wtt.consent", + "wtt.notice" + ], + "type": "string" + }, "PPUser": { "additionalProperties": false, "properties": { @@ -41,12 +190,16 @@ "data": { "additionalProperties": false, "properties": { + "application": { + "$ref": "#/definitions/Application%3C%22pp%22%3E" + }, "user": { "$ref": "#/definitions/PPUser" } }, "required": [ - "user" + "user", + "application" ], "type": "object" }, @@ -68,12 +221,16 @@ "data": { "additionalProperties": false, "properties": { + "application": { + "$ref": "#/definitions/Application%3C%22pa%22%3E" + }, "user": { "$ref": "#/definitions/UserBase" } }, "required": [ - "user" + "user", + "application" ], "type": "object" }, @@ -133,12 +290,16 @@ "data": { "additionalProperties": false, "properties": { + "application": { + "$ref": "#/definitions/Application%3C%22wtt%22%3E" + }, "user": { "$ref": "#/definitions/WTTUser" } }, "required": [ - "user" + "user", + "application" ], "type": "object" }, diff --git a/types/schemas/digitalPlanningApplication/enums/ApplicationTypes.ts b/types/schemas/digitalPlanningApplication/enums/ApplicationTypes.ts index 40bc0d7c..67a32d98 100644 --- a/types/schemas/digitalPlanningApplication/enums/ApplicationTypes.ts +++ b/types/schemas/digitalPlanningApplication/enums/ApplicationTypes.ts @@ -173,7 +173,7 @@ export const ApplicationTypes = { 'Works to trees - Notification of proposed works to a tree in a Conservation Area', }; -type ApplicationTypeKeys = keyof typeof ApplicationTypes; +export type ApplicationTypeKeys = keyof typeof ApplicationTypes; type GenericApplicationType = { value: TKey; diff --git a/types/schemas/discriminated/Application.ts b/types/schemas/discriminated/Application.ts new file mode 100644 index 00000000..bbc860b9 --- /dev/null +++ b/types/schemas/discriminated/Application.ts @@ -0,0 +1,17 @@ +import { + ApplicationTypeKeys, + PrimaryApplicationTypes, +} from '../digitalPlanningApplication/enums/ApplicationTypes'; + +/** + * @internal + * @description Enforces an application type which matches the given primary type + */ +type ApplicationTypeOf = Extract< + ApplicationTypeKeys, + `${T}.${string}` +>; + +export interface Application { + applicationType: ApplicationTypeOf; +} diff --git a/types/schemas/discriminated/index.ts b/types/schemas/discriminated/index.ts index 580f77b9..1fe5c602 100644 --- a/types/schemas/discriminated/index.ts +++ b/types/schemas/discriminated/index.ts @@ -1,10 +1,12 @@ import {PrimaryApplicationTypes} from '../digitalPlanningApplication/enums/ApplicationTypes'; +import {Application} from './Application'; import {User} from './User'; interface GenericApplication { primaryApplicationType: T; data: { user: User; + application: Application; }; }