barsa b1ff1e8fd3 Refactor GitHub Workflows to Consolidate Node and pnpm Setup
- Unified Node.js and pnpm setup across deploy, pr-checks, and security workflows by introducing a custom action for streamlined configuration.
- Removed redundant setup steps to enhance workflow clarity and maintainability.
- Updated security workflow to include concurrency control for better job management.
2025-12-25 19:01:00 +09:00

114 lines
3.7 KiB
TypeScript

import { z } from "zod";
import { SUPPORT_CASE_STATUS, SUPPORT_CASE_PRIORITY, SUPPORT_CASE_CATEGORY } from "./contract.js";
/**
* Portal status values (mapped from Salesforce Japanese API names)
*/
const supportCaseStatusValues = [
SUPPORT_CASE_STATUS.NEW,
SUPPORT_CASE_STATUS.IN_PROGRESS,
SUPPORT_CASE_STATUS.AWAITING_APPROVAL,
SUPPORT_CASE_STATUS.VPN_PENDING,
SUPPORT_CASE_STATUS.PENDING,
SUPPORT_CASE_STATUS.RESOLVED,
SUPPORT_CASE_STATUS.CLOSED,
] as const;
/**
* Portal priority values (mapped from Salesforce Japanese API names)
*/
const supportCasePriorityValues = [
SUPPORT_CASE_PRIORITY.LOW,
SUPPORT_CASE_PRIORITY.MEDIUM,
SUPPORT_CASE_PRIORITY.HIGH,
] as const;
const supportCaseCategoryValues = [
SUPPORT_CASE_CATEGORY.TECHNICAL,
SUPPORT_CASE_CATEGORY.BILLING,
SUPPORT_CASE_CATEGORY.GENERAL,
SUPPORT_CASE_CATEGORY.FEATURE_REQUEST,
] as const;
export const supportCaseStatusSchema = z.enum(supportCaseStatusValues);
export const supportCasePrioritySchema = z.enum(supportCasePriorityValues);
export const supportCaseCategorySchema = z.enum(supportCaseCategoryValues);
/**
* Support case schema - compatible with Salesforce Case object
* ID is a string (Salesforce ID format: 15 or 18 char alphanumeric)
*/
export const supportCaseSchema = z.object({
id: z.string().min(15).max(18),
caseNumber: z.string(),
subject: z.string().min(1),
status: z.string(), // Allow any status from Salesforce
priority: z.string(), // Allow any priority from Salesforce
category: z.string().nullable(), // Maps to Salesforce Type field
createdAt: z.string(),
updatedAt: z.string(),
closedAt: z.string().nullable(),
description: z.string(),
});
export const supportCaseSummarySchema = z.object({
total: z.number().int().nonnegative(),
open: z.number().int().nonnegative(),
highPriority: z.number().int().nonnegative(),
resolved: z.number().int().nonnegative(),
});
export const supportCaseListSchema = z.object({
cases: z.array(supportCaseSchema),
summary: supportCaseSummarySchema,
});
export const supportCaseFilterSchema = z
.object({
status: z.string().optional(),
priority: z.string().optional(),
category: z.string().optional(),
search: z.string().trim().min(1).optional(),
})
.default({});
/**
* Request schema for creating a new support case
*/
export const createCaseRequestSchema = z.object({
subject: z.string().min(1).max(255),
description: z.string().min(1).max(32000),
category: supportCaseCategorySchema.optional(),
priority: supportCasePrioritySchema.optional(),
});
/**
* Response schema for case creation
*/
export const createCaseResponseSchema = z.object({
id: z.string(),
caseNumber: z.string(),
});
/**
* Public contact form schema (unauthenticated)
*/
export const publicContactRequestSchema = z.object({
name: z.string().min(1, "Name is required"),
email: z.string().email("Valid email required"),
phone: z.string().optional(),
subject: z.string().min(1, "Subject is required"),
message: z.string().min(10, "Message must be at least 10 characters"),
});
export type SupportCaseStatus = z.infer<typeof supportCaseStatusSchema>;
export type SupportCasePriority = z.infer<typeof supportCasePrioritySchema>;
export type SupportCaseCategory = z.infer<typeof supportCaseCategorySchema>;
export type SupportCase = z.infer<typeof supportCaseSchema>;
export type SupportCaseSummary = z.infer<typeof supportCaseSummarySchema>;
export type SupportCaseList = z.infer<typeof supportCaseListSchema>;
export type SupportCaseFilter = z.infer<typeof supportCaseFilterSchema>;
export type CreateCaseRequest = z.infer<typeof createCaseRequestSchema>;
export type CreateCaseResponse = z.infer<typeof createCaseResponseSchema>;
export type PublicContactRequest = z.infer<typeof publicContactRequestSchema>;