Skip to content

Commit e74a668

Browse files
committed
fix typing
1 parent 50f68fc commit e74a668

File tree

5 files changed

+145
-67
lines changed

5 files changed

+145
-67
lines changed

apps/sim/app/api/tools/workday/get-compensation/route.ts

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@ import { type NextRequest, NextResponse } from 'next/server'
33
import { z } from 'zod'
44
import { checkInternalAuth } from '@/lib/auth/hybrid'
55
import { generateRequestId } from '@/lib/core/utils/request'
6-
import { createWorkdaySoapClient, extractRefId, type WorkdayReference } from '@/tools/workday/soap'
6+
import {
7+
createWorkdaySoapClient,
8+
extractRefId,
9+
normalizeSoapArray,
10+
type WorkdayCompensationDataSoap,
11+
type WorkdayCompensationPlanSoap,
12+
type WorkdayWorkerSoap,
13+
} from '@/tools/workday/soap'
714

815
export const dynamic = 'force-dynamic'
916

@@ -49,41 +56,34 @@ export async function POST(request: NextRequest) {
4956
},
5057
})
5158

52-
const rawWorker = result?.Response_Data?.Worker
53-
const workerData = (Array.isArray(rawWorker) ? rawWorker[0] : (rawWorker ?? null)) as Record<
54-
string,
55-
unknown
56-
> | null
57-
const workerInner = workerData?.Worker_Data as Record<string, unknown> | undefined
58-
const compensationData = workerInner?.Compensation_Data as Record<string, unknown> | undefined
59+
const worker =
60+
normalizeSoapArray(
61+
result?.Response_Data?.Worker as WorkdayWorkerSoap | WorkdayWorkerSoap[] | undefined
62+
)[0] ?? null
63+
const compensationData = worker?.Worker_Data?.Compensation_Data
5964

60-
const mapPlan = (p: Record<string, unknown>) => ({
61-
id: extractRefId(p.Compensation_Plan_Reference as WorkdayReference | undefined) ?? null,
62-
planName:
63-
(p.Compensation_Plan_Reference as Record<string, unknown> | undefined)?.attributes
64-
?.Descriptor ?? null,
65+
const mapPlan = (p: WorkdayCompensationPlanSoap) => ({
66+
id: extractRefId(p.Compensation_Plan_Reference) ?? null,
67+
planName: p.Compensation_Plan_Reference?.attributes?.Descriptor ?? null,
6568
amount: p.Amount ?? p.Per_Unit_Amount ?? p.Individual_Target_Amount ?? null,
66-
currency: extractRefId(p.Currency_Reference as WorkdayReference | undefined) ?? null,
67-
frequency: extractRefId(p.Frequency_Reference as WorkdayReference | undefined) ?? null,
69+
currency: extractRefId(p.Currency_Reference) ?? null,
70+
frequency: extractRefId(p.Frequency_Reference) ?? null,
6871
})
6972

70-
const planTypes = [
73+
const planTypeKeys: (keyof WorkdayCompensationDataSoap)[] = [
7174
'Employee_Base_Pay_Plan_Assignment_Data',
7275
'Employee_Salary_Unit_Plan_Assignment_Data',
7376
'Employee_Bonus_Plan_Assignment_Data',
7477
'Employee_Allowance_Plan_Assignment_Data',
7578
'Employee_Commission_Plan_Assignment_Data',
7679
'Employee_Stock_Plan_Assignment_Data',
7780
'Employee_Period_Salary_Plan_Assignment_Data',
78-
] as const
81+
]
7982

8083
const compensationPlans: ReturnType<typeof mapPlan>[] = []
81-
for (const planType of planTypes) {
82-
const raw = compensationData?.[planType]
83-
if (!raw) continue
84-
const arr = Array.isArray(raw) ? raw : [raw]
85-
for (const p of arr) {
86-
compensationPlans.push(mapPlan(p as Record<string, unknown>))
84+
for (const key of planTypeKeys) {
85+
for (const plan of normalizeSoapArray(compensationData?.[key])) {
86+
compensationPlans.push(mapPlan(plan))
8787
}
8888
}
8989

apps/sim/app/api/tools/workday/get-organizations/route.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { type NextRequest, NextResponse } from 'next/server'
33
import { z } from 'zod'
44
import { checkInternalAuth } from '@/lib/auth/hybrid'
55
import { generateRequestId } from '@/lib/core/utils/request'
6-
import { createWorkdaySoapClient, extractRefId } from '@/tools/workday/soap'
6+
import {
7+
createWorkdaySoapClient,
8+
extractRefId,
9+
normalizeSoapArray,
10+
type WorkdayOrganizationSoap,
11+
} from '@/tools/workday/soap'
712

813
export const dynamic = 'force-dynamic'
914

@@ -58,23 +63,20 @@ export async function POST(request: NextRequest) {
5863
Response_Group: { Include_Hierarchy_Data: true },
5964
})
6065

61-
const rawOrgs = result?.Response_Data?.Organization
62-
const orgsArray = Array.isArray(rawOrgs) ? rawOrgs : rawOrgs ? [rawOrgs] : []
66+
const orgsArray = normalizeSoapArray(
67+
result?.Response_Data?.Organization as
68+
| WorkdayOrganizationSoap
69+
| WorkdayOrganizationSoap[]
70+
| undefined
71+
)
6372

64-
const organizations = orgsArray.map((o: Record<string, unknown>) => {
65-
const orgData = o.Organization_Data as Record<string, unknown> | undefined
66-
return {
67-
id: extractRefId(o.Organization_Reference as Record<string, unknown>) ?? null,
68-
descriptor: o.Organization_Descriptor ?? null,
69-
type: orgData?.Organization_Type_Reference
70-
? (extractRefId(orgData.Organization_Type_Reference) ?? null)
71-
: null,
72-
subtype: orgData?.Organization_Subtype_Reference
73-
? (extractRefId(orgData.Organization_Subtype_Reference) ?? null)
74-
: null,
75-
isActive: orgData?.Inactive != null ? !orgData.Inactive : null,
76-
}
77-
})
73+
const organizations = orgsArray.map((o) => ({
74+
id: extractRefId(o.Organization_Reference) ?? null,
75+
descriptor: o.Organization_Descriptor ?? null,
76+
type: extractRefId(o.Organization_Data?.Organization_Type_Reference) ?? null,
77+
subtype: extractRefId(o.Organization_Data?.Organization_Subtype_Reference) ?? null,
78+
isActive: o.Organization_Data?.Inactive != null ? !o.Organization_Data.Inactive : null,
79+
}))
7880

7981
const total = result?.Response_Results?.Total_Results ?? organizations.length
8082

apps/sim/app/api/tools/workday/get-worker/route.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { type NextRequest, NextResponse } from 'next/server'
33
import { z } from 'zod'
44
import { checkInternalAuth } from '@/lib/auth/hybrid'
55
import { generateRequestId } from '@/lib/core/utils/request'
6-
import { createWorkdaySoapClient, extractRefId, type WorkdayReference } from '@/tools/workday/soap'
6+
import {
7+
createWorkdaySoapClient,
8+
extractRefId,
9+
normalizeSoapArray,
10+
type WorkdayWorkerSoap,
11+
} from '@/tools/workday/soap'
712

813
export const dynamic = 'force-dynamic'
914

@@ -52,24 +57,22 @@ export async function POST(request: NextRequest) {
5257
},
5358
})
5459

55-
const rawWorker = result?.Response_Data?.Worker
56-
const workerData = (Array.isArray(rawWorker) ? rawWorker[0] : (rawWorker ?? null)) as Record<
57-
string,
58-
unknown
59-
> | null
60-
const workerInner = (workerData?.Worker_Data ?? null) as Record<string, unknown> | null
60+
const worker =
61+
normalizeSoapArray(
62+
result?.Response_Data?.Worker as WorkdayWorkerSoap | WorkdayWorkerSoap[] | undefined
63+
)[0] ?? null
6164

6265
return NextResponse.json({
6366
success: true,
6467
output: {
65-
worker: workerData
68+
worker: worker
6669
? {
67-
id: extractRefId(workerData.Worker_Reference as WorkdayReference | undefined) ?? null,
68-
descriptor: (workerData.Worker_Descriptor as string) ?? null,
69-
personalData: workerInner?.Personal_Data ?? null,
70-
employmentData: workerInner?.Employment_Data ?? null,
71-
compensationData: workerInner?.Compensation_Data ?? null,
72-
organizationData: workerInner?.Organization_Data ?? null,
70+
id: extractRefId(worker.Worker_Reference) ?? null,
71+
descriptor: worker.Worker_Descriptor ?? null,
72+
personalData: worker.Worker_Data?.Personal_Data ?? null,
73+
employmentData: worker.Worker_Data?.Employment_Data ?? null,
74+
compensationData: worker.Worker_Data?.Compensation_Data ?? null,
75+
organizationData: worker.Worker_Data?.Organization_Data ?? null,
7376
}
7477
: null,
7578
},

apps/sim/app/api/tools/workday/list-workers/route.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { type NextRequest, NextResponse } from 'next/server'
33
import { z } from 'zod'
44
import { checkInternalAuth } from '@/lib/auth/hybrid'
55
import { generateRequestId } from '@/lib/core/utils/request'
6-
import { createWorkdaySoapClient, extractRefId } from '@/tools/workday/soap'
6+
import {
7+
createWorkdaySoapClient,
8+
extractRefId,
9+
normalizeSoapArray,
10+
type WorkdayWorkerSoap,
11+
} from '@/tools/workday/soap'
712

813
export const dynamic = 'force-dynamic'
914

@@ -51,18 +56,16 @@ export async function POST(request: NextRequest) {
5156
},
5257
})
5358

54-
const rawWorkers = result?.Response_Data?.Worker
55-
const workersArray = Array.isArray(rawWorkers) ? rawWorkers : rawWorkers ? [rawWorkers] : []
59+
const workersArray = normalizeSoapArray(
60+
result?.Response_Data?.Worker as WorkdayWorkerSoap | WorkdayWorkerSoap[] | undefined
61+
)
5662

57-
const workers = workersArray.map((w: Record<string, unknown>) => {
58-
const workerData = w.Worker_Data as Record<string, unknown> | undefined
59-
return {
60-
id: extractRefId(w.Worker_Reference as Record<string, unknown>) ?? null,
61-
descriptor: w.Worker_Descriptor ?? null,
62-
personalData: workerData?.Personal_Data ?? null,
63-
employmentData: workerData?.Employment_Data ?? null,
64-
}
65-
})
63+
const workers = workersArray.map((w) => ({
64+
id: extractRefId(w.Worker_Reference) ?? null,
65+
descriptor: w.Worker_Descriptor ?? null,
66+
personalData: w.Worker_Data?.Personal_Data ?? null,
67+
employmentData: w.Worker_Data?.Employment_Data ?? null,
68+
}))
6669

6770
const total = result?.Response_Results?.Total_Results ?? workers.length
6871

apps/sim/tools/workday/soap.ts

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,82 @@ export interface WorkdayReference {
3434
attributes?: Record<string, string>
3535
}
3636

37-
interface WorkdayIdEntry {
37+
export interface WorkdayIdEntry {
3838
$value?: string
3939
_?: string
4040
attributes?: Record<string, string>
4141
}
4242

43+
/**
44+
* Raw SOAP response shape for a single Worker returned by Get_Workers.
45+
* Fields are optional since the Response_Group controls what gets included.
46+
*/
47+
export interface WorkdayWorkerSoap {
48+
Worker_Reference?: WorkdayReference
49+
Worker_Descriptor?: string
50+
Worker_Data?: WorkdayWorkerDataSoap
51+
}
52+
53+
export interface WorkdayWorkerDataSoap {
54+
Personal_Data?: Record<string, unknown>
55+
Employment_Data?: Record<string, unknown>
56+
Compensation_Data?: WorkdayCompensationDataSoap
57+
Organization_Data?: Record<string, unknown>
58+
}
59+
60+
export interface WorkdayCompensationDataSoap {
61+
Employee_Base_Pay_Plan_Assignment_Data?:
62+
| WorkdayCompensationPlanSoap
63+
| WorkdayCompensationPlanSoap[]
64+
Employee_Salary_Unit_Plan_Assignment_Data?:
65+
| WorkdayCompensationPlanSoap
66+
| WorkdayCompensationPlanSoap[]
67+
Employee_Bonus_Plan_Assignment_Data?: WorkdayCompensationPlanSoap | WorkdayCompensationPlanSoap[]
68+
Employee_Allowance_Plan_Assignment_Data?:
69+
| WorkdayCompensationPlanSoap
70+
| WorkdayCompensationPlanSoap[]
71+
Employee_Commission_Plan_Assignment_Data?:
72+
| WorkdayCompensationPlanSoap
73+
| WorkdayCompensationPlanSoap[]
74+
Employee_Stock_Plan_Assignment_Data?: WorkdayCompensationPlanSoap | WorkdayCompensationPlanSoap[]
75+
Employee_Period_Salary_Plan_Assignment_Data?:
76+
| WorkdayCompensationPlanSoap
77+
| WorkdayCompensationPlanSoap[]
78+
}
79+
80+
export interface WorkdayCompensationPlanSoap {
81+
Compensation_Plan_Reference?: WorkdayReference
82+
Amount?: number
83+
Per_Unit_Amount?: number
84+
Individual_Target_Amount?: number
85+
Currency_Reference?: WorkdayReference
86+
Frequency_Reference?: WorkdayReference
87+
}
88+
89+
/**
90+
* Raw SOAP response shape for a single Organization returned by Get_Organizations.
91+
*/
92+
export interface WorkdayOrganizationSoap {
93+
Organization_Reference?: WorkdayReference
94+
Organization_Descriptor?: string
95+
Organization_Data?: WorkdayOrganizationDataSoap
96+
}
97+
98+
export interface WorkdayOrganizationDataSoap {
99+
Organization_Type_Reference?: WorkdayReference
100+
Organization_Subtype_Reference?: WorkdayReference
101+
Inactive?: boolean
102+
}
103+
104+
/**
105+
* Normalizes a SOAP response field that may be a single object, an array, or undefined
106+
* into a consistently typed array.
107+
*/
108+
export function normalizeSoapArray<T>(value: T | T[] | undefined): T[] {
109+
if (!value) return []
110+
return Array.isArray(value) ? value : [value]
111+
}
112+
43113
type SoapOperationFn = (
44114
args: Record<string, unknown>
45115
) => Promise<[WorkdaySoapResult, string, Record<string, unknown>, string]>

0 commit comments

Comments
 (0)