import {z} from 'zod' export type GetApiForumGetPostAndParentAwaitingApprovalChildPostIdArgs = {childPostId: number, showbanned?: string | undefined}; export type GetApiForumGetPostAndParentAwaitingApprovalChildPostIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const ignoresIgnoreResponse = z.object({isIgnored: z.boolean().optional(), ignoreFlags: z.number().int().optional()}); export const forumPostResponse = z.object({lastReplyTimestamp: z.string().optional(), IsPinned: z.boolean().optional(), urlMediaType: z.number().int().optional(), thumbnail: z.string().optional(), popularity: z.number().int().optional(), isActive: z.boolean().optional(), isAnnouncement: z.boolean().optional(), userRating: z.number().int().optional(), userHasRated: z.boolean().optional(), userHasMutedPost: z.boolean().optional(), latestReplyPostId: z.number().int().optional(), latestReplyAuthorId: z.number().int().optional(), ignoreStatus: ignoresIgnoreResponse.optional(), locale: z.string().optional()}); export const userUserToUserContext = z.object({isFollowing: z.boolean().optional(), ignoreStatus: ignoresIgnoreResponse.optional(), globalIgnoreEndDate: z.string().optional()}); export const userGeneralUser = z.object({membershipId: z.number().int().optional(), uniqueName: z.string().optional(), normalizedName: z.string().optional(), displayName: z.string().optional(), profilePicture: z.number().int().optional(), profileTheme: z.number().int().optional(), userTitle: z.number().int().optional(), successMessageFlags: z.number().int().optional(), isDeleted: z.boolean().optional(), about: z.string().optional(), firstAccess: z.string().optional(), lastUpdate: z.string().optional(), legacyPortalUID: z.number().int().optional(), context: userUserToUserContext.optional(), psnDisplayName: z.string().optional(), xboxDisplayName: z.string().optional(), fbDisplayName: z.string().optional(), showActivity: z.boolean().optional(), locale: z.string().optional(), localeInheritDefault: z.boolean().optional(), lastBanReportId: z.number().int().optional(), showGroupMessaging: z.boolean().optional(), profilePicturePath: z.string().optional(), profilePictureWidePath: z.string().optional(), profileThemeName: z.string().optional(), userTitleDisplay: z.string().optional(), statusText: z.string().optional(), statusDate: z.string().optional(), profileBanExpire: z.string().optional(), blizzardDisplayName: z.string().optional(), steamDisplayName: z.string().optional(), stadiaDisplayName: z.string().optional(), twitchDisplayName: z.string().optional(), cachedBungieGlobalDisplayName: z.string().optional(), cachedBungieGlobalDisplayNameCode: z.number().int().optional(), egsDisplayName: z.string().optional()}); export const groupsV2GroupFeatures = z.object({maximumMembers: z.number().int().optional(), maximumMembershipsOfGroupType: z.number().int().optional(), capabilities: z.number().int().optional(), membershipTypes: z.array(z.number().int()).optional(), invitePermissionOverride: z.boolean().optional(), updateCulturePermissionOverride: z.boolean().optional(), hostGuidedGamePermissionOverride: z.number().int().optional(), updateBannerPermissionOverride: z.boolean().optional(), joinLevel: z.number().int().optional()}); export const destinyDestinyProgressionResetEntry = z.object({season: z.number().int().optional(), resets: z.number().int().optional()}); export const destinyDestinyStat = z.object({statHash: z.number().int().optional(), value: z.number().int().optional()}); export const destinyDestinyProgressionRewardItemSocketOverrideState = z.object({rewardItemStats: z.record(z.string(), destinyDestinyStat).optional(), itemState: z.number().int().optional()}); export const destinyDestinyProgression = z.object({progressionHash: z.number().int().optional(), dailyProgress: z.number().int().optional(), dailyLimit: z.number().int().optional(), weeklyProgress: z.number().int().optional(), weeklyLimit: z.number().int().optional(), currentProgress: z.number().int().optional(), level: z.number().int().optional(), levelCap: z.number().int().optional(), stepIndex: z.number().int().optional(), progressToNextLevel: z.number().int().optional(), nextLevelAt: z.number().int().optional(), currentResetCount: z.number().int().optional(), seasonResets: z.array(destinyDestinyProgressionResetEntry).optional(), rewardItemStates: z.array(z.number().int()).optional(), rewardItemSocketOverrideStates: z.record(z.string(), destinyDestinyProgressionRewardItemSocketOverrideState).optional()}); export const groupsV2ClanBanner = z.object({decalId: z.number().int().optional(), decalColorId: z.number().int().optional(), decalBackgroundColorId: z.number().int().optional(), gonfalonId: z.number().int().optional(), gonfalonColorId: z.number().int().optional(), gonfalonDetailId: z.number().int().optional(), gonfalonDetailColorId: z.number().int().optional()}); export const groupsV2GroupV2ClanInfoAndInvestment = z.object({d2ClanProgressions: z.record(z.string(), destinyDestinyProgression).optional(), clanCallsign: z.string().optional(), clanBannerData: groupsV2ClanBanner.optional()}); export const groupsV2GroupV2 = z.object({groupId: z.number().int().optional(), name: z.string().optional(), groupType: z.number().int().optional(), membershipIdCreated: z.number().int().optional(), creationDate: z.string().optional(), modificationDate: z.string().optional(), about: z.string().optional(), tags: z.array(z.string()).optional(), memberCount: z.number().int().optional(), isPublic: z.boolean().optional(), isPublicTopicAdminOnly: z.boolean().optional(), motto: z.string().optional(), allowChat: z.boolean().optional(), isDefaultPostPublic: z.boolean().optional(), chatSecurity: z.number().int().optional(), locale: z.string().optional(), avatarImageIndex: z.number().int().optional(), homepage: z.number().int().optional(), membershipOption: z.number().int().optional(), defaultPublicity: z.number().int().optional(), theme: z.string().optional(), bannerPath: z.string().optional(), avatarPath: z.string().optional(), conversationId: z.number().int().optional(), enableInvitationMessagingForAdmins: z.boolean().optional(), banExpireDate: z.string().optional(), features: groupsV2GroupFeatures.optional(), remoteGroupId: z.number().int().optional(), clanInfo: groupsV2GroupV2ClanInfoAndInvestment.optional()}); export const groupsV2GroupUserInfoCard = z.object({LastSeenDisplayName: z.string().optional(), LastSeenDisplayNameType: z.number().int().optional(), supplementalDisplayName: z.string().optional(), iconPath: z.string().optional(), crossSaveOverride: z.number().int().optional(), applicableMembershipTypes: z.array(z.number().int()).optional(), isPublic: z.boolean().optional(), membershipType: z.number().int().optional(), membershipId: z.number().int().optional(), displayName: z.string().optional(), bungieGlobalDisplayName: z.string().optional(), bungieGlobalDisplayNameCode: z.number().int().optional()}); export const userUserInfoCard = z.object({supplementalDisplayName: z.string().optional(), iconPath: z.string().optional(), crossSaveOverride: z.number().int().optional(), applicableMembershipTypes: z.array(z.number().int()).optional(), isPublic: z.boolean().optional(), membershipType: z.number().int().optional(), membershipId: z.number().int().optional(), displayName: z.string().optional(), bungieGlobalDisplayName: z.string().optional(), bungieGlobalDisplayNameCode: z.number().int().optional()}); export const groupsV2GroupMember = z.object({memberType: z.number().int().optional(), isOnline: z.boolean().optional(), lastOnlineStatusChange: z.number().int().optional(), groupId: z.number().int().optional(), destinyUserInfo: groupsV2GroupUserInfoCard.optional(), bungieNetUserInfo: userUserInfoCard.optional(), joinDate: z.string().optional()}); export const groupsV2GroupPotentialMember = z.object({potentialStatus: z.number().int().optional(), groupId: z.number().int().optional(), destinyUserInfo: groupsV2GroupUserInfoCard.optional(), bungieNetUserInfo: userUserInfoCard.optional(), joinDate: z.string().optional()}); export const groupsV2GroupResponse = z.object({detail: groupsV2GroupV2.optional(), founder: groupsV2GroupMember.optional(), alliedIds: z.array(z.number().int()).optional(), parentGroup: groupsV2GroupV2.optional(), allianceStatus: z.number().int().optional(), groupJoinInviteCount: z.number().int().optional(), currentUserMembershipsInactiveForDestiny: z.boolean().optional(), currentUserMemberMap: z.record(z.string(), groupsV2GroupMember).optional(), currentUserPotentialMemberMap: z.record(z.string(), groupsV2GroupPotentialMember).optional()}); export const tagsModelsContractsTagResponse = z.object({tagText: z.string().optional(), ignoreStatus: ignoresIgnoreResponse.optional()}); export const forumPollResult = z.object({answerText: z.string().optional(), answerSlot: z.number().int().optional(), lastVoteDate: z.string().optional(), votes: z.number().int().optional(), requestingUserVoted: z.boolean().optional()}); export const forumPollResponse = z.object({topicId: z.number().int().optional(), results: z.array(forumPollResult).optional(), totalVotes: z.number().int().optional()}); export const forumForumRecruitmentDetail = z.object({topicId: z.number().int().optional(), microphoneRequired: z.boolean().optional(), intensity: z.number().int().optional(), tone: z.number().int().optional(), approved: z.boolean().optional(), conversationId: z.number().int().optional(), playerSlotsTotal: z.number().int().optional(), playerSlotsRemaining: z.number().int().optional(), Fireteam: z.array(userGeneralUser).optional(), kickedPlayerIds: z.array(z.number().int()).optional()}); export const queriesPagedQuery = z.object({itemsPerPage: z.number().int().optional(), currentPage: z.number().int().optional(), requestContinuationToken: z.string().optional()}); export const forumPostSearchResponse = z.object({relatedPosts: z.array(forumPostResponse).optional(), authors: z.array(userGeneralUser).optional(), groups: z.array(groupsV2GroupResponse).optional(), searchedTags: z.array(tagsModelsContractsTagResponse).optional(), polls: z.array(forumPollResponse).optional(), recruitmentDetails: z.array(forumForumRecruitmentDetail).optional(), availablePages: z.number().int().optional(), results: z.array(forumPostResponse).optional(), totalResults: z.number().int().optional(), hasMore: z.boolean().optional(), query: queriesPagedQuery.optional(), replacementContinuationToken: z.string().optional(), useTotalResults: z.boolean().optional()}); export const getApiForumGetPostAndParentAwaitingApprovalChildPostIdResponse = z.object({Response: forumPostSearchResponse.optional(), ErrorCode: z.number().int().optional(), ThrottleSeconds: z.number().int().optional(), ErrorStatus: z.string().optional(), Message: z.string().optional(), MessageData: z.record(z.string(), z.string()).optional(), DetailedErrorTrace: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Returns the post specified and its immediate parent of posts that are awaiting approval. * * GET /Forum/GetPostAndParentAwaitingApproval/{childPostId}/ */ export const getApiForumGetPostAndParentAwaitingApprovalChildPostId = async (args: GetApiForumGetPostAndParentAwaitingApprovalChildPostIdArgs, options?: GetApiForumGetPostAndParentAwaitingApprovalChildPostIdOptions) => { const {baseUrl = "https://www.bungie.net/Platform", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.showbanned != null) query.append("showbanned", String(args.showbanned)) const url = `${baseUrl.replace(/\/+$/, '')}/Forum/GetPostAndParentAwaitingApproval/${encodeURIComponent(String(args.childPostId))}/${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiForumGetPostAndParentAwaitingApprovalChildPostIdResponse, await res.json()) };