SeedCompany / cord-api-v3

Bible translation project management API
MIT License
18 stars 4 forks source link

Properly handle nils in filters #3246

Closed CarsonF closed 3 weeks ago

CarsonF commented 3 weeks ago

Instead of weird hacks to try to default to empty objects.

This is cleaning in GQL schema, more straightforward, and doesn't cause inconsistencies with upcoming nested filters.

Basically the next iteration of #2709

github-actions[bot] commented 3 weeks ago

🗞 GraphQL Summary

View schema changes ```diff @@ -140,9 +140,9 @@ input CeremonyListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: CeremonyFilters = {} + filter: CeremonyFilters """The order in which to sort the list""" order: Order! = ASC @@ -1328,9 +1328,9 @@ """Whether the requesting user can delete this resource""" canDelete: Boolean! """Return the file nodes of this directory""" - children(input: FileListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): FileListOutput! + children(input: FileListInput = {count: 25, order: ASC, page: 1, sort: "name"}): FileListOutput! createdAt: DateTime! """ The user who created this node. @@ -1473,9 +1473,9 @@ input EngagementListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: EngagementFilters = {} + filter: EngagementFilters """The order in which to sort the list""" order: Order! = ASC @@ -1718,9 +1718,9 @@ """Whether the requesting user can delete this resource""" canDelete: Boolean! """Return the versions of this file""" - children(input: FileListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): FileListOutput! + children(input: FileListInput = {count: 25, order: ASC, page: 1, sort: "name"}): FileListOutput! createdAt: DateTime! """ The user who created this node. @@ -1781,9 +1781,9 @@ input FileListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: FileFilters = {} + filter: FileFilters """The order in which to sort the list""" order: Order! = ASC @@ -2187,9 +2187,9 @@ currentNarrativeReportDue: SecuredPeriodicReport! """The legacy department ID""" departmentId: SecuredStringNullable! - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! estimatedSubmission: SecuredDateNullable! fieldRegion: SecuredFieldRegion! financialReportPeriod: SecuredReportPeriod! financialReportReceivedAt: SecuredDateTimeNullable! @@ -2200,9 +2200,9 @@ """ Same as `engagements` field just typed as a list of concrete InternshipEngagements instead of the interface. InternshipProjects will only have InternshipEngagements. """ - internshipEngagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredInternshipEngagementList! + internshipEngagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredInternshipEngagementList! marketingLocation: SecuredLocation! marketingRegionOverride: SecuredLocation! modifiedAt: DateTime! mouEnd: SecuredDateNullable! @@ -2251,9 +2251,9 @@ stepChangedAt: SecuredDateTime! tags: SecuredTags! """The project members""" - team(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! + team(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! type: ProjectType! workflowEvents: [ProjectWorkflowEvent!]! } @@ -2309,9 +2309,9 @@ """The pronunciation of the display name""" displayNamePronunciation: SecuredStringNullable! """The list of the language's engagements.""" - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! ethnologue: EthnologueLanguage! firstScripture: SecuredFirstScripture! hasExternalFirstScripture: SecuredBoolean! @@ -2357,9 +2357,9 @@ """ presetInventory: SecuredBoolean! """The list of projects the language is engagement in.""" - projects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): SecuredTranslationProjectList! + projects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredTranslationProjectList! """ Registry of Dialects Code. 5 digit number including leading zeros. @@ -2430,9 +2430,9 @@ associated partnerships which are "producing" each medium. """ partnershipsProducingMediums: SecuredPartnershipsProducingMediums! pnp: SecuredFile! - products(input: ProductListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProductList! + products(input: ProductListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProductList! progressReport(date: Date!): SecuredProgressReport! progressReports(input: PeriodicReportListInput = {count: 25, order: ASC, page: 1, sort: "start"}): ProgressReportList! project: Project! @@ -2485,9 +2485,9 @@ input LanguageListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: LanguageFilters = {} + filter: LanguageFilters """The order in which to sort the list""" order: Order! = ASC @@ -2686,9 +2686,9 @@ currentNarrativeReportDue: SecuredPeriodicReport! """The legacy department ID""" departmentId: SecuredStringNullable! - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! estimatedSubmission: SecuredDateNullable! fieldRegion: SecuredFieldRegion! financialReportPeriod: SecuredReportPeriod! financialReportReceivedAt: SecuredDateTimeNullable! @@ -2699,9 +2699,9 @@ """ Same as `engagements` field just typed as a list of concrete LanguageEngagements instead of the interface. TranslationProjects will only have LanguageEngagements. """ - languageEngagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! + languageEngagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! marketingLocation: SecuredLocation! marketingRegionOverride: SecuredLocation! modifiedAt: DateTime! mouEnd: SecuredDateNullable! @@ -2750,9 +2750,9 @@ stepChangedAt: SecuredDateTime! tags: SecuredTags! """The project members""" - team(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! + team(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! type: ProjectType! workflowEvents: [ProjectWorkflowEvent!]! } @@ -2803,9 +2803,9 @@ currentNarrativeReportDue: SecuredPeriodicReport! """The legacy department ID""" departmentId: SecuredStringNullable! - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! estimatedSubmission: SecuredDateNullable! fieldRegion: SecuredFieldRegion! financialReportPeriod: SecuredReportPeriod! financialReportReceivedAt: SecuredDateTimeNullable! @@ -2816,9 +2816,9 @@ """ Same as `engagements` field just typed as a list of concrete LanguageEngagements instead of the interface. TranslationProjects will only have LanguageEngagements. """ - languageEngagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! + languageEngagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! marketingLocation: SecuredLocation! marketingRegionOverride: SecuredLocation! modifiedAt: DateTime! mouEnd: SecuredDateNullable! @@ -2867,9 +2867,9 @@ stepChangedAt: SecuredDateTime! tags: SecuredTags! """The project members""" - team(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! + team(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! type: ProjectType! workflowEvents: [ProjectWorkflowEvent!]! } @@ -3448,9 +3448,9 @@ countries: SecuredLocations! createdAt: DateTime! """Engagements of the partner's affiliated projects""" - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): EngagementListOutput! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): EngagementListOutput! fieldRegions: SecuredFieldRegions! financialReportingTypes: SecuredFinancialReportingTypes! globalInnovationsClient: SecuredBoolean! @@ -3458,9 +3458,9 @@ id: ID! languageOfWiderCommunication: SecuredLanguageNullable! """Languages of the partner's affiliated translation projects""" - languages(input: LanguageListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): SecuredLanguageList! + languages(input: LanguageListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredLanguageList! languagesOfConsulting: SecuredLanguages! modifiedAt: DateTime! organization: SecuredOrganization! @@ -3472,9 +3472,9 @@ """List of posts belonging to the parent node.""" posts(input: PostListInput = {count: 25, order: DESC, page: 1, sort: "createdAt"}): SecuredPostList! """The list of projects the partner has a partnership with.""" - projects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): SecuredProjectList! + projects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredProjectList! """Based on the project's sensitivity""" sensitivity: Sensitivity! startDate: SecuredDateNullable! @@ -3488,9 +3488,9 @@ input PartnerListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: PartnerFilters = {} + filter: PartnerFilters """The order in which to sort the list""" order: Order! = ASC @@ -3938,9 +3938,9 @@ input ProductListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: ProductFilters = {} + filter: ProductFilters """The order in which to sort the list""" order: Order! = ASC @@ -4385,9 +4385,9 @@ currentNarrativeReportDue: SecuredPeriodicReport! """The legacy department ID""" departmentId: SecuredStringNullable! - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! estimatedSubmission: SecuredDateNullable! fieldRegion: SecuredFieldRegion! financialReportPeriod: SecuredReportPeriod! financialReportReceivedAt: SecuredDateTimeNullable! @@ -4445,9 +4445,9 @@ stepChangedAt: SecuredDateTime! tags: SecuredTags! """The project members""" - team(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! + team(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! type: ProjectType! workflowEvents: [ProjectWorkflowEvent!]! } @@ -4545,9 +4545,9 @@ input ProjectListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: ProjectFilters = {} + filter: ProjectFilters """The order in which to sort the list""" order: Order! = ASC @@ -4593,9 +4593,9 @@ input ProjectMemberListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: ProjectMemberFilters = {} + filter: ProjectMemberFilters """The order in which to sort the list""" order: Order! = ASC @@ -4791,9 +4791,9 @@ """Returns a list of available steps for the given constraints.""" availableProductSteps(methodology: ProductMethodology, type: ProducibleType): [ProductStep!]! """Look up ceremonies""" - ceremonies(input: CeremonyListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "projectName"}): CeremonyListOutput! @deprecated(reason: "Query via engagement instead") + ceremonies(input: CeremonyListInput = {count: 25, order: ASC, page: 1, sort: "projectName"}): CeremonyListOutput! @deprecated(reason: "Query via engagement instead") """Look up a ceremony by its ID""" ceremony(id: ID!): Ceremony! @deprecated(reason: "Query via engagement instead") changeset(id: ID!): Changeset! @@ -4820,9 +4820,9 @@ """Lookup an engagement by ID""" engagement(changeset: ID, id: ID!): Engagement! """Look up engagements""" - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): EngagementListOutput! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): EngagementListOutput! """Look up an ethno art""" ethnoArt(id: ID!): EthnoArt! @@ -4857,9 +4857,9 @@ ianaCountries: [IanaCountry!]! ianaCountry(code: String!): IanaCountry """Look up internship projects""" - internshipProjects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): InternshipProjectListOutput! + internshipProjects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): InternshipProjectListOutput! """Returns whether or not the requesting user has pinned the resource ID""" isPinned( """A resource ID""" @@ -4875,12 +4875,12 @@ """Lookup a LanguageEngagement by ID""" languageEngagement(changeset: ID, id: ID!): LanguageEngagement! """Look up language engagements""" - languageEngagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): LanguageEngagementListOutput! + languageEngagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): LanguageEngagementListOutput! """Look up languages""" - languages(input: LanguageListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): LanguageListOutput! + languages(input: LanguageListInput = {count: 25, order: ASC, page: 1, sort: "name"}): LanguageListOutput! """Read one Location by id""" location(id: ID!): Location! @@ -4897,9 +4897,9 @@ """Look up a partner by its ID""" partner(id: ID!): Partner! """Look up partners""" - partners(input: PartnerListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): PartnerListOutput! + partners(input: PartnerListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): PartnerListOutput! """Look up a partnership by ID""" partnership(changeset: ID, id: ID!): Partnership! @@ -4919,23 +4919,23 @@ """Read a product by id""" product(changeset: ID, id: ID!): Product! """Look up products""" - products(input: ProductListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): ProductListOutput! + products(input: ProductListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): ProductListOutput! """Look up a project by its ID""" project(changeset: ID, id: ID!): Project! """Look up a project member by ID""" projectMember(id: ID!): ProjectMember! @deprecated(reason: "Query via project instead") """Look up project members""" - projectMembers(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): ProjectMemberListOutput! @deprecated(reason: "Query via project instead") + projectMembers(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): ProjectMemberListOutput! @deprecated(reason: "Query via project instead") projectTypeFinancialApprovers(projectTypes: [ProjectType!]): [ProjectTypeFinancialApprover!]! projectWorkflow: Workflow! """Look up projects""" - projects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): ProjectListOutput! + projects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): ProjectListOutput! """Perform a search across resources""" search(input: SearchInput!): SearchOutput! @@ -4961,9 +4961,9 @@ timezone(name: String!): TimeZone timezones: [TimeZone!]! """Look up translation projects""" - translationProjects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): TranslationProjectListOutput! + translationProjects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): TranslationProjectListOutput! """Look up unavailabilities by user id""" unavailabilities(input: UnavailabilityListInput = {count: 25, order: DESC, page: 1, sort: "start"}): UnavailabilityListOutput! @deprecated(reason: "Query via user instead") @@ -4978,9 +4978,9 @@ """Look up a user by its ID""" user(id: ID!): User! """Look up users""" - users(input: UserListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "id"}): UserListOutput! + users(input: UserListInput = {count: 25, order: ASC, page: 1, sort: "id"}): UserListOutput! wait(delay: String!): Boolean! } input RegisterInput { @@ -6653,9 +6653,9 @@ currentNarrativeReportDue: SecuredPeriodicReport! """The legacy department ID""" departmentId: SecuredStringNullable! - engagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! + engagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredEngagementList! estimatedSubmission: SecuredDateNullable! fieldRegion: SecuredFieldRegion! financialReportPeriod: SecuredReportPeriod! financialReportReceivedAt: SecuredDateTimeNullable! @@ -6668,9 +6668,9 @@ """ Same as `engagements` field just typed as a list of concrete LanguageEngagements instead of the interface. TranslationProjects will only have LanguageEngagements. """ - languageEngagements(input: EngagementListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! + languageEngagements(input: EngagementListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredLanguageEngagementList! marketingLocation: SecuredLocation! marketingRegionOverride: SecuredLocation! modifiedAt: DateTime! mouEnd: SecuredDateNullable! @@ -6719,9 +6719,9 @@ stepChangedAt: SecuredDateTime! tags: SecuredTags! """The project members""" - team(input: ProjectMemberListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! + team(input: ProjectMemberListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredProjectMemberList! type: ProjectType! workflowEvents: [ProjectWorkflowEvent!]! } @@ -7462,14 +7462,14 @@ id: ID! knownLanguages: [KnownLanguage!]! locations(input: LocationListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredLocationList! organizations(input: OrganizationListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredOrganizationList! - partners(input: PartnerListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "createdAt"}): SecuredPartnerList! + partners(input: PartnerListInput = {count: 25, order: ASC, page: 1, sort: "createdAt"}): SecuredPartnerList! phone: SecuredStringNullable! """Does the requesting user have this pinned?""" pinned: Boolean! - projects(input: ProjectListInput = {count: 25, filter: {}, order: ASC, page: 1, sort: "name"}): SecuredProjectList! + projects(input: ProjectListInput = {count: 25, order: ASC, page: 1, sort: "name"}): SecuredProjectList! realFirstName: SecuredString! realLastName: SecuredString! roles: SecuredRoles! status: SecuredUserStatus! @@ -7485,9 +7485,9 @@ input UserListInput { """The number of items to return in a single page""" count: Int! = 25 - filter: UserFilters = {} + filter: UserFilters """The order in which to sort the list""" order: Order! = ASC ```

⚠️ Dangerous Changes