diff --git a/KsApi/GraphAPI.swift b/KsApi/GraphAPI.swift index 16f0362c68..24bac53296 100644 --- a/KsApi/GraphAPI.swift +++ b/KsApi/GraphAPI.swift @@ -8427,23 +8427,20 @@ public enum GraphAPI { public let operationDefinition: String = """ query FetchMyBackedProjects($first: Int = null, $after: String = null, $withStoredCards: Boolean = false) { - me { + projects(first: $first, after: $after, backed: true, sort: END_DATE) { __typename - backingsCount - backedProjects(first: $first, after: $after) { + nodes { __typename - nodes { - __typename - ...ProjectFragment - } - pageInfo { - __typename - hasNextPage - endCursor - hasPreviousPage - startCursor - } + ...ProjectFragment + } + pageInfo { + __typename + hasNextPage + endCursor + hasPreviousPage + startCursor } + totalCount } } """ @@ -8481,7 +8478,7 @@ public enum GraphAPI { public static var selections: [GraphQLSelection] { return [ - GraphQLField("me", type: .object(Me.selections)), + GraphQLField("projects", arguments: ["first": GraphQLVariable("first"), "after": GraphQLVariable("after"), "backed": true, "sort": "END_DATE"], type: .object(Project.selections)), ] } @@ -8491,28 +8488,29 @@ public enum GraphAPI { self.resultMap = unsafeResultMap } - public init(me: Me? = nil) { - self.init(unsafeResultMap: ["__typename": "Query", "me": me.flatMap { (value: Me) -> ResultMap in value.resultMap }]) + public init(projects: Project? = nil) { + self.init(unsafeResultMap: ["__typename": "Query", "projects": projects.flatMap { (value: Project) -> ResultMap in value.resultMap }]) } - /// You. - public var me: Me? { + /// Get some projects + public var projects: Project? { get { - return (resultMap["me"] as? ResultMap).flatMap { Me(unsafeResultMap: $0) } + return (resultMap["projects"] as? ResultMap).flatMap { Project(unsafeResultMap: $0) } } set { - resultMap.updateValue(newValue?.resultMap, forKey: "me") + resultMap.updateValue(newValue?.resultMap, forKey: "projects") } } - public struct Me: GraphQLSelectionSet { - public static let possibleTypes: [String] = ["User"] + public struct Project: GraphQLSelectionSet { + public static let possibleTypes: [String] = ["ProjectsConnectionWithTotalCount"] public static var selections: [GraphQLSelection] { return [ GraphQLField("__typename", type: .nonNull(.scalar(String.self))), - GraphQLField("backingsCount", type: .nonNull(.scalar(Int.self))), - GraphQLField("backedProjects", arguments: ["first": GraphQLVariable("first"), "after": GraphQLVariable("after")], type: .object(BackedProject.selections)), + GraphQLField("nodes", type: .list(.object(Node.selections))), + GraphQLField("pageInfo", type: .nonNull(.object(PageInfo.selections))), + GraphQLField("totalCount", type: .nonNull(.scalar(Int.self))), ] } @@ -8522,8 +8520,8 @@ public enum GraphAPI { self.resultMap = unsafeResultMap } - public init(backingsCount: Int, backedProjects: BackedProject? = nil) { - self.init(unsafeResultMap: ["__typename": "User", "backingsCount": backingsCount, "backedProjects": backedProjects.flatMap { (value: BackedProject) -> ResultMap in value.resultMap }]) + public init(nodes: [Node?]? = nil, pageInfo: PageInfo, totalCount: Int) { + self.init(unsafeResultMap: ["__typename": "ProjectsConnectionWithTotalCount", "nodes": nodes.flatMap { (value: [Node?]) -> [ResultMap?] in value.map { (value: Node?) -> ResultMap? in value.flatMap { (value: Node) -> ResultMap in value.resultMap } } }, "pageInfo": pageInfo.resultMap, "totalCount": totalCount]) } public var __typename: String { @@ -8535,34 +8533,42 @@ public enum GraphAPI { } } - /// Number of backings for this user. - public var backingsCount: Int { + /// A list of nodes. + public var nodes: [Node?]? { get { - return resultMap["backingsCount"]! as! Int + return (resultMap["nodes"] as? [ResultMap?]).flatMap { (value: [ResultMap?]) -> [Node?] in value.map { (value: ResultMap?) -> Node? in value.flatMap { (value: ResultMap) -> Node in Node(unsafeResultMap: value) } } } } set { - resultMap.updateValue(newValue, forKey: "backingsCount") + resultMap.updateValue(newValue.flatMap { (value: [Node?]) -> [ResultMap?] in value.map { (value: Node?) -> ResultMap? in value.flatMap { (value: Node) -> ResultMap in value.resultMap } } }, forKey: "nodes") } } - /// Projects a user has backed. - public var backedProjects: BackedProject? { + /// Information to aid in pagination. + public var pageInfo: PageInfo { get { - return (resultMap["backedProjects"] as? ResultMap).flatMap { BackedProject(unsafeResultMap: $0) } + return PageInfo(unsafeResultMap: resultMap["pageInfo"]! as! ResultMap) } set { - resultMap.updateValue(newValue?.resultMap, forKey: "backedProjects") + resultMap.updateValue(newValue.resultMap, forKey: "pageInfo") } } - public struct BackedProject: GraphQLSelectionSet { - public static let possibleTypes: [String] = ["UserBackedProjectsConnection"] + public var totalCount: Int { + get { + return resultMap["totalCount"]! as! Int + } + set { + resultMap.updateValue(newValue, forKey: "totalCount") + } + } + + public struct Node: GraphQLSelectionSet { + public static let possibleTypes: [String] = ["Project"] public static var selections: [GraphQLSelection] { return [ GraphQLField("__typename", type: .nonNull(.scalar(String.self))), - GraphQLField("nodes", type: .list(.object(Node.selections))), - GraphQLField("pageInfo", type: .nonNull(.object(PageInfo.selections))), + GraphQLFragmentSpread(ProjectFragment.self), ] } @@ -8572,10 +8578,6 @@ public enum GraphAPI { self.resultMap = unsafeResultMap } - public init(nodes: [Node?]? = nil, pageInfo: PageInfo) { - self.init(unsafeResultMap: ["__typename": "UserBackedProjectsConnection", "nodes": nodes.flatMap { (value: [Node?]) -> [ResultMap?] in value.map { (value: Node?) -> ResultMap? in value.flatMap { (value: Node) -> ResultMap in value.resultMap } } }, "pageInfo": pageInfo.resultMap]) - } - public var __typename: String { get { return resultMap["__typename"]! as! String @@ -8585,148 +8587,102 @@ public enum GraphAPI { } } - /// A list of nodes. - public var nodes: [Node?]? { - get { - return (resultMap["nodes"] as? [ResultMap?]).flatMap { (value: [ResultMap?]) -> [Node?] in value.map { (value: ResultMap?) -> Node? in value.flatMap { (value: ResultMap) -> Node in Node(unsafeResultMap: value) } } } - } - set { - resultMap.updateValue(newValue.flatMap { (value: [Node?]) -> [ResultMap?] in value.map { (value: Node?) -> ResultMap? in value.flatMap { (value: Node) -> ResultMap in value.resultMap } } }, forKey: "nodes") - } - } - - /// Information to aid in pagination. - public var pageInfo: PageInfo { + public var fragments: Fragments { get { - return PageInfo(unsafeResultMap: resultMap["pageInfo"]! as! ResultMap) + return Fragments(unsafeResultMap: resultMap) } set { - resultMap.updateValue(newValue.resultMap, forKey: "pageInfo") + resultMap += newValue.resultMap } } - public struct Node: GraphQLSelectionSet { - public static let possibleTypes: [String] = ["Project"] - - public static var selections: [GraphQLSelection] { - return [ - GraphQLField("__typename", type: .nonNull(.scalar(String.self))), - GraphQLFragmentSpread(ProjectFragment.self), - ] - } - + public struct Fragments { public private(set) var resultMap: ResultMap public init(unsafeResultMap: ResultMap) { self.resultMap = unsafeResultMap } - public var __typename: String { - get { - return resultMap["__typename"]! as! String - } - set { - resultMap.updateValue(newValue, forKey: "__typename") - } - } - - public var fragments: Fragments { + public var projectFragment: ProjectFragment { get { - return Fragments(unsafeResultMap: resultMap) + return ProjectFragment(unsafeResultMap: resultMap) } set { resultMap += newValue.resultMap } } + } + } - public struct Fragments { - public private(set) var resultMap: ResultMap - - public init(unsafeResultMap: ResultMap) { - self.resultMap = unsafeResultMap - } + public struct PageInfo: GraphQLSelectionSet { + public static let possibleTypes: [String] = ["PageInfo"] - public var projectFragment: ProjectFragment { - get { - return ProjectFragment(unsafeResultMap: resultMap) - } - set { - resultMap += newValue.resultMap - } - } - } + public static var selections: [GraphQLSelection] { + return [ + GraphQLField("__typename", type: .nonNull(.scalar(String.self))), + GraphQLField("hasNextPage", type: .nonNull(.scalar(Bool.self))), + GraphQLField("endCursor", type: .scalar(String.self)), + GraphQLField("hasPreviousPage", type: .nonNull(.scalar(Bool.self))), + GraphQLField("startCursor", type: .scalar(String.self)), + ] } - public struct PageInfo: GraphQLSelectionSet { - public static let possibleTypes: [String] = ["PageInfo"] + public private(set) var resultMap: ResultMap - public static var selections: [GraphQLSelection] { - return [ - GraphQLField("__typename", type: .nonNull(.scalar(String.self))), - GraphQLField("hasNextPage", type: .nonNull(.scalar(Bool.self))), - GraphQLField("endCursor", type: .scalar(String.self)), - GraphQLField("hasPreviousPage", type: .nonNull(.scalar(Bool.self))), - GraphQLField("startCursor", type: .scalar(String.self)), - ] - } + public init(unsafeResultMap: ResultMap) { + self.resultMap = unsafeResultMap + } - public private(set) var resultMap: ResultMap + public init(hasNextPage: Bool, endCursor: String? = nil, hasPreviousPage: Bool, startCursor: String? = nil) { + self.init(unsafeResultMap: ["__typename": "PageInfo", "hasNextPage": hasNextPage, "endCursor": endCursor, "hasPreviousPage": hasPreviousPage, "startCursor": startCursor]) + } - public init(unsafeResultMap: ResultMap) { - self.resultMap = unsafeResultMap + public var __typename: String { + get { + return resultMap["__typename"]! as! String } - - public init(hasNextPage: Bool, endCursor: String? = nil, hasPreviousPage: Bool, startCursor: String? = nil) { - self.init(unsafeResultMap: ["__typename": "PageInfo", "hasNextPage": hasNextPage, "endCursor": endCursor, "hasPreviousPage": hasPreviousPage, "startCursor": startCursor]) + set { + resultMap.updateValue(newValue, forKey: "__typename") } + } - public var __typename: String { - get { - return resultMap["__typename"]! as! String - } - set { - resultMap.updateValue(newValue, forKey: "__typename") - } + /// When paginating forwards, are there more items? + public var hasNextPage: Bool { + get { + return resultMap["hasNextPage"]! as! Bool } - - /// When paginating forwards, are there more items? - public var hasNextPage: Bool { - get { - return resultMap["hasNextPage"]! as! Bool - } - set { - resultMap.updateValue(newValue, forKey: "hasNextPage") - } + set { + resultMap.updateValue(newValue, forKey: "hasNextPage") } + } - /// When paginating forwards, the cursor to continue. - public var endCursor: String? { - get { - return resultMap["endCursor"] as? String - } - set { - resultMap.updateValue(newValue, forKey: "endCursor") - } + /// When paginating forwards, the cursor to continue. + public var endCursor: String? { + get { + return resultMap["endCursor"] as? String } + set { + resultMap.updateValue(newValue, forKey: "endCursor") + } + } - /// When paginating backwards, are there more items? - public var hasPreviousPage: Bool { - get { - return resultMap["hasPreviousPage"]! as! Bool - } - set { - resultMap.updateValue(newValue, forKey: "hasPreviousPage") - } + /// When paginating backwards, are there more items? + public var hasPreviousPage: Bool { + get { + return resultMap["hasPreviousPage"]! as! Bool } + set { + resultMap.updateValue(newValue, forKey: "hasPreviousPage") + } + } - /// When paginating backwards, the cursor to continue. - public var startCursor: String? { - get { - return resultMap["startCursor"] as? String - } - set { - resultMap.updateValue(newValue, forKey: "startCursor") - } + /// When paginating backwards, the cursor to continue. + public var startCursor: String? { + get { + return resultMap["startCursor"] as? String + } + set { + resultMap.updateValue(newValue, forKey: "startCursor") } } } diff --git a/KsApi/models/graphql/adapters/FetchProjectsEnvelope+FetchBackerProjectsQueryData.swift b/KsApi/models/graphql/adapters/FetchProjectsEnvelope+FetchBackerProjectsQueryData.swift index 16180bbd23..4229fe9d5b 100644 --- a/KsApi/models/graphql/adapters/FetchProjectsEnvelope+FetchBackerProjectsQueryData.swift +++ b/KsApi/models/graphql/adapters/FetchProjectsEnvelope+FetchBackerProjectsQueryData.swift @@ -4,7 +4,7 @@ import ReactiveSwift extension FetchProjectsEnvelope { static func fetchProjectsEnvelope(from data: GraphAPI.FetchMyBackedProjectsQuery.Data) -> SignalProducer { - guard let projects = data.me?.backedProjects?.nodes?.compactMap({ node -> Project? in + guard let projects = data.projects?.nodes?.compactMap({ node -> Project? in if let fragment = node?.fragments.projectFragment { return Project.project(from: fragment, currentUserChosenCurrency: nil) } @@ -16,9 +16,9 @@ extension FetchProjectsEnvelope { let envelope = FetchProjectsEnvelope( type: .backed, projects: projects, - cursor: data.me?.backedProjects?.pageInfo.endCursor, - hasNextPage: data.me?.backedProjects?.pageInfo.hasNextPage ?? false, - totalCount: data.me?.backingsCount ?? 0 + cursor: data.projects?.pageInfo.endCursor, + hasNextPage: data.projects?.pageInfo.hasNextPage ?? false, + totalCount: data.projects?.totalCount ?? 0 ) return SignalProducer(value: envelope) diff --git a/KsApi/queries/FetchMyBackedProjectsQuery.graphql b/KsApi/queries/FetchMyBackedProjectsQuery.graphql index 8c6f7e434c..95777f7a12 100644 --- a/KsApi/queries/FetchMyBackedProjectsQuery.graphql +++ b/KsApi/queries/FetchMyBackedProjectsQuery.graphql @@ -1,17 +1,16 @@ query FetchMyBackedProjects($first: Int = null, $after: String = null, $withStoredCards: Boolean = false) { - me { - backingsCount - backedProjects(first: $first, after: $after) { - nodes { - ...ProjectFragment - } - pageInfo { - hasNextPage - endCursor - hasPreviousPage - startCursor - } + projects(first: $first, after: $after, backed: true, sort: END_DATE) { + nodes { + ...ProjectFragment } + pageInfo { + hasNextPage + endCursor + hasPreviousPage + startCursor + } + totalCount } } + diff --git a/KsApi/queries/templates/FetchMyBackedProjectsQuery.json b/KsApi/queries/templates/FetchMyBackedProjectsQuery.json index 9366af1b0e..63477bf9a8 100644 --- a/KsApi/queries/templates/FetchMyBackedProjectsQuery.json +++ b/KsApi/queries/templates/FetchMyBackedProjectsQuery.json @@ -1,307 +1,221 @@ { "data": { - "me": { - "__typename": "User", - "backingsCount": 3, - "backedProjects": { - "__typename": "UserBackedProjectsConnection", - "nodes": [ - { - "__typename": "Project", - "availableCardTypes": [ - "VISA", - "MASTERCARD", - "AMEX", - "DISCOVER", - "JCB", - "DINERS", - "UNION_PAY" - ], - "backersCount": 39, - "category": { + "projects": { + "__typename": "UserBackedProjectsConnection", + "nodes": [ + { + "__typename": "Project", + "availableCardTypes": [ + "VISA", + "MASTERCARD", + "AMEX", + "DISCOVER", + "JCB", + "DINERS", + "UNION_PAY" + ], + "backersCount": 39, + "category": { + "__typename": "Category", + "id": "Q2F0ZWdvcnktMzYx", + "name": "Web", + "analyticsName": "Web", + "parentCategory": { "__typename": "Category", - "id": "Q2F0ZWdvcnktMzYx", - "name": "Web", - "analyticsName": "Web", - "parentCategory": { - "__typename": "Category", - "id": "Q2F0ZWdvcnktMTM=", - "name": "Journalism", - "analyticsName": "Journalism" - } - }, - "canComment": true, - "commentsCount": 0, - "country": { - "__typename": "Country", - "code": "US", - "name": "the United States" - }, - "creator": { - "__typename": "User", - "backings": null, - "backingsCount": 187, - "chosenCurrency": null, - "createdProjects": { - "__typename": "UserCreatedProjectsConnection", - "totalCount": 2 - }, - "email": "l@example.com", - "hasPassword": null, - "hasUnreadMessages": null, - "hasUnseenActivity": null, - "id": "VXNlci0x", - "imageUrl": "example.com/image-l", - "isAppleConnected": null, - "isBlocked": false, - "isCreator": null, - "isDeliverable": null, - "isEmailVerified": true, - "isFacebookConnected": false, - "isKsrAdmin": null, - "isFollowing": false, - "isSocializing": null, - "location": { - "__typename": "Location", - "country": "US", - "countryName": "United States", - "displayableName": "Portland, OR", - "id": "TG9jYXRpb24tMjQ3NTY4Nw==", - "name": "Portland" - }, - "name": "L Lion", - "needsFreshFacebookToken": null, - "newsletterSubscriptions": null, - "notifications": null, - "optedOutOfRecommendations": null, - "showPublicProfile": null, - "savedProjects": null, - "storedCards": { - "__typename": "UserCreditCardTypeConnection", - "nodes": [], - "totalCount": 0 - }, - "surveyResponses": null, - "uid": "1" - }, - "currency": "USD", - "deadlineAt": 1710196633, - "description": "test blurb", - "environmentalCommitments": [], - "aiDisclosure": { - "__typename": "AiDisclosure", - "id": "QWlEaXNjbG9zdXJlLTM4MTg0", - "fundingForAiAttribution": null, - "fundingForAiConsent": null, - "fundingForAiOption": null, - "generatedByAiConsent": null, - "generatedByAiDetails": null, - "involvesAi": false, - "involvesFunding": false, - "involvesGeneration": false, - "involvesOther": false, - "otherAiDetails": null - }, - "faqs": { - "__typename": "ProjectFaqConnection", - "nodes": [] - }, - "finalCollectionDate": null, - "fxRate": 1, - "goal": { - "__typename": "Money", - "amount": "1000.0", - "currency": "USD", - "symbol": "$" - }, - "image": { - "__typename": "Photo", - "id": "UGhvdG8t", - "url": "https://i-dev.kickstarter.com/missing_project_photo.png?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=mtxWHN34oWziTC9W1L2IsQI9T3gsd9J1j3cqDfYyzAQ%3D" - }, - "isProjectWeLove": false, - "isProjectOfTheDay": false, - "isInPostCampaignPledgingPhase": true, - "isWatched": true, - "isLaunched": true, - "launchedAt": 1710800428, + "id": "Q2F0ZWdvcnktMTM=", + "name": "Journalism", + "analyticsName": "Journalism" + } + }, + "canComment": true, + "commentsCount": 0, + "country": { + "__typename": "Country", + "code": "US", + "name": "the United States" + }, + "creator": { + "__typename": "User", + "backings": null, + "backingsCount": 187, + "chosenCurrency": null, + "createdProjects": { + "__typename": "UserCreatedProjectsConnection", + "totalCount": 2 + }, + "email": "l@example.com", + "hasPassword": null, + "hasUnreadMessages": null, + "hasUnseenActivity": null, + "id": "VXNlci0x", + "imageUrl": "example.com/image-l", + "isAppleConnected": null, + "isBlocked": false, + "isCreator": null, + "isDeliverable": null, + "isEmailVerified": true, + "isFacebookConnected": false, + "isKsrAdmin": null, + "isFollowing": false, + "isSocializing": null, "location": { "__typename": "Location", "country": "US", "countryName": "United States", - "displayableName": "United States", - "id": "TG9jYXRpb24tMjM0MjQ5Nzc=", - "name": "United States" - }, - "maxPledge": 10000, - "minPledge": 1, - "name": "Zan's Late Pledge Campaign", - "pid": 745600992, - "pledged": { - "__typename": "Money", - "amount": "343.0", - "currency": "USD", - "symbol": "$" - }, - "posts": { - "__typename": "PostConnection", + "displayableName": "Portland, OR", + "id": "TG9jYXRpb24tMjQ3NTY4Nw==", + "name": "Portland" + }, + "name": "L Lion", + "needsFreshFacebookToken": null, + "newsletterSubscriptions": null, + "notifications": null, + "optedOutOfRecommendations": null, + "showPublicProfile": null, + "savedProjects": null, + "storedCards": { + "__typename": "UserCreditCardTypeConnection", + "nodes": [], "totalCount": 0 }, - "prelaunchActivated": false, - "postCampaignPledgingEnabled": true, - "risks": "May not deliver", - "sendMetaCapiEvents": false, - "slug": "cainlevy/zans-late-pledge-campaign", - "state": "SUCCESSFUL", - "stateChangedAt": 1710800431, - "story": "This project is fantastic!", - "tags": [], - "url": "https://staging.kickstarter.com/projects/cainlevy/zans-late-pledge-campaign", - "usdExchangeRate": 1, - "video": null, - "watchesCount": 6 - }, - { - "__typename": "Project", - "availableCardTypes": [ - "VISA", - "MASTERCARD", - "AMEX", - "DISCOVER", - "JCB", - "DINERS", - "UNION_PAY" - ], - "backersCount": 27, - "category": { - "__typename": "Category", - "id": "Q2F0ZWdvcnktMjcz", - "name": "Playing Cards", - "analyticsName": "Playing Cards", - "parentCategory": { - "__typename": "Category", - "id": "Q2F0ZWdvcnktMTI=", - "name": "Games", - "analyticsName": "Games" - } - }, - "canComment": true, - "commentsCount": 1, - "country": { - "__typename": "Country", - "code": "US", - "name": "the United States" - }, - "creator": { - "__typename": "User", - "backings": { - "__typename": "UserBackingsConnection", - "nodes": [] - }, - "backingsCount": 0, - "chosenCurrency": null, - "createdProjects": { - "__typename": "UserCreatedProjectsConnection", - "totalCount": 1 - }, - "email": "info@example.com", - "hasPassword": null, - "hasUnreadMessages": null, - "hasUnseenActivity": null, - "id": "VXNlci05MTc4MzYxMg==", - "imageUrl": "example.com/infographic", - "isAppleConnected": null, - "isBlocked": false, - "isCreator": true, - "isDeliverable": null, - "isEmailVerified": true, - "isFacebookConnected": false, - "isKsrAdmin": null, - "isFollowing": false, - "isSocializing": null, - "location": { - "__typename": "Location", - "country": "US", - "countryName": "United States", - "displayableName": "Olathe, KS", - "id": "TG9jYXRpb24tMjQ2NDYzOQ==", - "name": "Olathe" - }, - "name": "Info Graphic", - "needsFreshFacebookToken": null, - "newsletterSubscriptions": null, - "notifications": null, - "optedOutOfRecommendations": null, - "showPublicProfile": null, - "savedProjects": null, - "storedCards": { - "__typename": "UserCreditCardTypeConnection", - "nodes": [], - "totalCount": 0 - }, - "surveyResponses": null, - "uid": "2" - }, + "surveyResponses": null, + "uid": "1" + }, + "currency": "USD", + "deadlineAt": 1710196633, + "description": "test blurb", + "environmentalCommitments": [], + "aiDisclosure": { + "__typename": "AiDisclosure", + "id": "QWlEaXNjbG9zdXJlLTM4MTg0", + "fundingForAiAttribution": null, + "fundingForAiConsent": null, + "fundingForAiOption": null, + "generatedByAiConsent": null, + "generatedByAiDetails": null, + "involvesAi": false, + "involvesFunding": false, + "involvesGeneration": false, + "involvesOther": false, + "otherAiDetails": null + }, + "faqs": { + "__typename": "ProjectFaqConnection", + "nodes": [] + }, + "finalCollectionDate": null, + "fxRate": 1, + "goal": { + "__typename": "Money", + "amount": "1000.0", "currency": "USD", - "deadlineAt": 1708911385, - "description": "Bringing The Golf Course To The Card Table - Visit CardGolfTour.com for more information", - "environmentalCommitments": [ - { - "__typename": "EnvironmentalCommitment", - "commitmentCategory": "long_lasting_design", - "description": "Our game is long-lasting design because the playing cards are made of durable material that are built for repeated shuffling and play.", - "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYx" - }, - { - "__typename": "EnvironmentalCommitment", - "commitmentCategory": "reusability_and_recyclability", - "description": "Our game components are primarily paper-based and therefore can be recycled as desired.", - "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYz" - }, - { - "__typename": "EnvironmentalCommitment", - "commitmentCategory": "sustainable_materials", - "description": "We plan to use recycled and up-cycled materials to make game components and packaging.", - "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYy" - } - ], - "aiDisclosure": { - "__typename": "AiDisclosure", - "id": "QWlEaXNjbG9zdXJlLTIwMDUw", - "fundingForAiAttribution": null, - "fundingForAiConsent": null, - "fundingForAiOption": null, - "generatedByAiConsent": null, - "generatedByAiDetails": null, - "involvesAi": false, - "involvesFunding": false, - "involvesGeneration": false, - "involvesOther": false, - "otherAiDetails": null - }, - "faqs": { - "__typename": "ProjectFaqConnection", + "symbol": "$" + }, + "image": { + "__typename": "Photo", + "id": "UGhvdG8t", + "url": "https://i-dev.kickstarter.com/missing_project_photo.png?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=mtxWHN34oWziTC9W1L2IsQI9T3gsd9J1j3cqDfYyzAQ%3D" + }, + "isProjectWeLove": false, + "isProjectOfTheDay": false, + "isInPostCampaignPledgingPhase": true, + "isWatched": true, + "isLaunched": true, + "launchedAt": 1710800428, + "location": { + "__typename": "Location", + "country": "US", + "countryName": "United States", + "displayableName": "United States", + "id": "TG9jYXRpb24tMjM0MjQ5Nzc=", + "name": "United States" + }, + "maxPledge": 10000, + "minPledge": 1, + "name": "Zan's Late Pledge Campaign", + "pid": 745600992, + "pledged": { + "__typename": "Money", + "amount": "343.0", + "currency": "USD", + "symbol": "$" + }, + "posts": { + "__typename": "PostConnection", + "totalCount": 0 + }, + "prelaunchActivated": false, + "postCampaignPledgingEnabled": true, + "risks": "May not deliver", + "sendMetaCapiEvents": false, + "slug": "cainlevy/zans-late-pledge-campaign", + "state": "SUCCESSFUL", + "stateChangedAt": 1710800431, + "story": "This project is fantastic!", + "tags": [], + "url": "https://staging.kickstarter.com/projects/cainlevy/zans-late-pledge-campaign", + "usdExchangeRate": 1, + "video": null, + "watchesCount": 6 + }, + { + "__typename": "Project", + "availableCardTypes": [ + "VISA", + "MASTERCARD", + "AMEX", + "DISCOVER", + "JCB", + "DINERS", + "UNION_PAY" + ], + "backersCount": 27, + "category": { + "__typename": "Category", + "id": "Q2F0ZWdvcnktMjcz", + "name": "Playing Cards", + "analyticsName": "Playing Cards", + "parentCategory": { + "__typename": "Category", + "id": "Q2F0ZWdvcnktMTI=", + "name": "Games", + "analyticsName": "Games" + } + }, + "canComment": true, + "commentsCount": 1, + "country": { + "__typename": "Country", + "code": "US", + "name": "the United States" + }, + "creator": { + "__typename": "User", + "backings": { + "__typename": "UserBackingsConnection", "nodes": [] }, - "finalCollectionDate": null, - "fxRate": 1, - "goal": { - "__typename": "Money", - "amount": "2000.0", - "currency": "USD", - "symbol": "$" - }, - "image": { - "__typename": "Photo", - "id": "UGhvdG8tNDI5MDQzMjI=", - "url": "https://i-dev.kickstarter.com/assets/042/904/322/6ed4afa3dd309a42d162ff2823353444_original.jpg?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=bqyRXuSjHQ2F1dtGgfxBNiD%2B6vZYJR5%2B%2FjrSA5aYwNg%3D" + "backingsCount": 0, + "chosenCurrency": null, + "createdProjects": { + "__typename": "UserCreatedProjectsConnection", + "totalCount": 1 }, - "isProjectWeLove": true, - "isProjectOfTheDay": false, - "isInPostCampaignPledgingPhase": false, - "isWatched": false, - "isLaunched": true, - "launchedAt": 1706319385, + "email": "info@example.com", + "hasPassword": null, + "hasUnreadMessages": null, + "hasUnseenActivity": null, + "id": "VXNlci05MTc4MzYxMg==", + "imageUrl": "example.com/infographic", + "isAppleConnected": null, + "isBlocked": false, + "isCreator": true, + "isDeliverable": null, + "isEmailVerified": true, + "isFacebookConnected": false, + "isKsrAdmin": null, + "isFollowing": false, + "isSocializing": null, "location": { "__typename": "Location", "country": "US", @@ -310,269 +224,352 @@ "id": "TG9jYXRpb24tMjQ2NDYzOQ==", "name": "Olathe" }, - "maxPledge": 10000, - "minPledge": 1, - "name": "Card Golf Tour", - "pid": 1290897231, - "pledged": { - "__typename": "Money", - "amount": "1654.0", - "currency": "USD", - "symbol": "$" - }, - "posts": { - "__typename": "PostConnection", - "totalCount": 1 + "name": "Info Graphic", + "needsFreshFacebookToken": null, + "newsletterSubscriptions": null, + "notifications": null, + "optedOutOfRecommendations": null, + "showPublicProfile": null, + "savedProjects": null, + "storedCards": { + "__typename": "UserCreditCardTypeConnection", + "nodes": [], + "totalCount": 0 }, - "prelaunchActivated": true, - "postCampaignPledgingEnabled": false, - "risks": "Game components include playing cards, instructional material and scorecards that are printed and shipped. Supply chain challenges that have increased over the past few years have introduced fulfillment risks in terms of shipping delays. We have vetted our printing partner through references from other card game creators and are confident our printing partner will be able to fulfill orders according to schedule.", - "sendMetaCapiEvents": false, - "slug": "cardgolftour/card-golf-tour", - "state": "LIVE", - "stateChangedAt": 1706319388, - "story": "

What Is Card Golf Tour?

Card Golf Tour is a project developed by me (Nick Sahrmann) and my brother (Luke Sahrmann). We have always had great interest in both golf and card games. Our grandparents introduced us to the card game \"Card Golf\" a couple years back, and we instantly loved it. However, after over a year of playing the game, we thought to ourselves - \"there must be a way to make card golf more competitive and play more like the actual game of golf.\" Thus, Card Golf Tour was born.  

Card Golf Tour improves on the traditional game of card golf by introducing: 

Our mission with Card Golf Tour is twofold; We want to help people learn about the game of golf while also creating a competitive and strategic card game that appeals to avid golfers and card players alike. We are running our Kickstarter campaign to raise funds for the production of our first 100 units of Card Golf Tour. To learn more about Card Golf Tour, visit our website at https://cardgolftour.com/.

\n
\n\"\"\n
\n\n
\n

Meet The Team

\n
\n\"\"\n
\n\n
\n

Nick Sahrmann - Freshman at the University of Kansas

\n
\n\"\"\n
\n\n
\n

Luke Sahrmann - Junior at Olathe West High School

Components

Each copy of Card Golf Tour includes the following items:

\n
\n\"\"\n
\n\n
\n

How To Play

The aim of the game in Card Golf Tour is to shoot par or better (minimize your point total) on each hole (hand) by strategically drawing, matching, keeping, and discarding cards. Card Golf Tour is designed to be played with a group of 2-5 players and will take anywhere from 10-90 minutes based on the amount of hands you play. Listed is below is a brief guide to Card Golf Tour as well as an instructional video on our YouTube channel.

Note: Composition of the deck

Each deck of Card Golf Tour playing cards includes 54 cards. There are 14 types of cards in the deck:

Each type of card has 4 cards in the deck, 2 green cards of the respective type and 2 black cards. The exception to this is the putter card, in which there are only two putters in the deck, one black putter and one green putter (think of the putter as the joker of a standard deck of playing cards).

In Card Golf Tour, the lower the point value of the card, the more valuable that card is. This means that the putter is typically the best card in the deck while the sand wedge is typically the worst card in the deck.

Setup:

Step 1- The dealer will shuffle the deck of cards and then deal. Each player will be dealt 4, 6, or 8 cards face down based on the par of the hole (dealer will reference the scorecard for the par of the hole). 

Step 2- The dealer will then place the remaining cards in the the center of the table, forming the draw pile. The top card of the draw pile will then be turned over and placed next to the draw pile forming the discard pile. 

Step 3- Each player will arrange their cards in two horizontal rows of 2, 3, or 4 cards based on how many cards they were dealt. They will then chose 1, 2, or 3 cards to turn face up based on the amount of cards they were dealt. 

Play:

Step 1- Each player will roll the dice to determine order of play. The lowest roll will be player 1, and the lowest dice roll between the player to the right and left of player 1 will be player 2. Play will then continue in this direction for the remainder of the hole. 

Step 2- Through a series of drawing, matching, keeping, and discarding cards players will attempt to minimize their hands point total (see our instructional video attached below for further explanation of this facet of the game). 

Step 3- Once one player has all of their cards face up on the table, the hand ends and each remaining player is allowed one more turn. 

Score:

Step 1- Each player will find the sum of their hand. 

Step 2- Each player will then find the score to par that their hand total falls under (see our instructional video below for further information on the scoring system in Card Golf Tour). 

Step 3- Each player will then report their score on the hole to the scorekeeper who will keep a running tally of each players score throughout the round.

Note- Each step outlined above will be repeated for each subsequent hand in the game. It is recommended that the group plays either 9 or 18 hands, just like how golfers usually play 9 or 18 holes in a round.

At the conclusion of the game, the player with the lowest score is the winner!

Instructional Video:

\n
\n

What Tour Players Are Saying...

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Stretch Goals

At Card Golf Tour, we have decided not to use stretch goals as a part of our crowdfunding campaign. Our reasoning for this is simple.

We want to ensure that each backer who pledges to the campaign will be able to open their box and immediately begin playing Card Golf Tour. Some Kickstarter campaigns withhold certain components of their game and use them as a reward for a stretch goal. At Card Golf Tour, we have designed our game holistically so that no add-ons are necessary in order to play our game. While we have designed many different ways to play Card Golf Tour, we have decided that we will release these updates to the game at scheduled times throughout the upcoming year to keep the game feeling new and exciting. 

Our team at Card Golf Tour is using our Kickstarter campaign as a proof of concept campaign. We do not intend to make a profit on our product using Kickstarter, but rather, want to use our campaign to spread awareness about our game. Card Golf Tour is a hobby for us, not a job.

Shipping

Our team at Card Golf Tour has made the decision to only ship within the United States. Shipping will be $5 to anywhere within the U.S and no matter the pledge level. 

Backers may notice that we have set March 2024 as our targeted delivery date for our product. This is an unusually short turnaround as our campaign will be ending on February 25th. The reason for this is that we have already produced our first 100 copies of Card Golf Tour. This means that once the campaign ends, assuming it has met its goal, we will be able to immediately begin the process of shipping out our game to backers. While we anticipate that shipping will take 1-2 weeks, we cannot guarantee anything and will make sure to provide continued updates as needed.

\n
\n\"\"\n
\n\n
\n", - "tags": [], - "url": "https://staging.kickstarter.com/projects/cardgolftour/card-golf-tour", - "usdExchangeRate": 1, - "video": { - "__typename": "Video", - "id": "VmlkZW8tMTI1OTU3MQ==", - "videoSources": { - "__typename": "VideoSources", - "high": { - "__typename": "VideoSourceInfo", - "src": "https://v2.kickstarter.com/1712855593-yY8sggPJeOr47xDdQppZMFfUgqaXSUm9RGIGfWLghPo%3D/projects/4683889/video-1259571-h264_high.mp4" - }, - "hls": { - "__typename": "VideoSourceInfo", - "src": "https://v2.kickstarter.com/1712855593-yY8sggPJeOr47xDdQppZMFfUgqaXSUm9RGIGfWLghPo%3D/projects/4683889/video-1259571-hls_playlist.m3u8" - } + "surveyResponses": null, + "uid": "2" + }, + "currency": "USD", + "deadlineAt": 1708911385, + "description": "Bringing The Golf Course To The Card Table - Visit CardGolfTour.com for more information", + "environmentalCommitments": [ + { + "__typename": "EnvironmentalCommitment", + "commitmentCategory": "long_lasting_design", + "description": "Our game is long-lasting design because the playing cards are made of durable material that are built for repeated shuffling and play.", + "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYx" + }, + { + "__typename": "EnvironmentalCommitment", + "commitmentCategory": "reusability_and_recyclability", + "description": "Our game components are primarily paper-based and therefore can be recycled as desired.", + "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYz" + }, + { + "__typename": "EnvironmentalCommitment", + "commitmentCategory": "sustainable_materials", + "description": "We plan to use recycled and up-cycled materials to make game components and packaging.", + "id": "RW52aXJvbm1lbnRhbENvbW1pdG1lbnQtMjI5NDYy" + } + ], + "aiDisclosure": { + "__typename": "AiDisclosure", + "id": "QWlEaXNjbG9zdXJlLTIwMDUw", + "fundingForAiAttribution": null, + "fundingForAiConsent": null, + "fundingForAiOption": null, + "generatedByAiConsent": null, + "generatedByAiDetails": null, + "involvesAi": false, + "involvesFunding": false, + "involvesGeneration": false, + "involvesOther": false, + "otherAiDetails": null + }, + "faqs": { + "__typename": "ProjectFaqConnection", + "nodes": [] + }, + "finalCollectionDate": null, + "fxRate": 1, + "goal": { + "__typename": "Money", + "amount": "2000.0", + "currency": "USD", + "symbol": "$" + }, + "image": { + "__typename": "Photo", + "id": "UGhvdG8tNDI5MDQzMjI=", + "url": "https://i-dev.kickstarter.com/assets/042/904/322/6ed4afa3dd309a42d162ff2823353444_original.jpg?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=bqyRXuSjHQ2F1dtGgfxBNiD%2B6vZYJR5%2B%2FjrSA5aYwNg%3D" + }, + "isProjectWeLove": true, + "isProjectOfTheDay": false, + "isInPostCampaignPledgingPhase": false, + "isWatched": false, + "isLaunched": true, + "launchedAt": 1706319385, + "location": { + "__typename": "Location", + "country": "US", + "countryName": "United States", + "displayableName": "Olathe, KS", + "id": "TG9jYXRpb24tMjQ2NDYzOQ==", + "name": "Olathe" + }, + "maxPledge": 10000, + "minPledge": 1, + "name": "Card Golf Tour", + "pid": 1290897231, + "pledged": { + "__typename": "Money", + "amount": "1654.0", + "currency": "USD", + "symbol": "$" + }, + "posts": { + "__typename": "PostConnection", + "totalCount": 1 + }, + "prelaunchActivated": true, + "postCampaignPledgingEnabled": false, + "risks": "Game components include playing cards, instructional material and scorecards that are printed and shipped. Supply chain challenges that have increased over the past few years have introduced fulfillment risks in terms of shipping delays. We have vetted our printing partner through references from other card game creators and are confident our printing partner will be able to fulfill orders according to schedule.", + "sendMetaCapiEvents": false, + "slug": "cardgolftour/card-golf-tour", + "state": "LIVE", + "stateChangedAt": 1706319388, + "story": "

What Is Card Golf Tour?

Card Golf Tour is a project developed by me (Nick Sahrmann) and my brother (Luke Sahrmann). We have always had great interest in both golf and card games. Our grandparents introduced us to the card game \"Card Golf\" a couple years back, and we instantly loved it. However, after over a year of playing the game, we thought to ourselves - \"there must be a way to make card golf more competitive and play more like the actual game of golf.\" Thus, Card Golf Tour was born.  

Card Golf Tour improves on the traditional game of card golf by introducing: 

Our mission with Card Golf Tour is twofold; We want to help people learn about the game of golf while also creating a competitive and strategic card game that appeals to avid golfers and card players alike. We are running our Kickstarter campaign to raise funds for the production of our first 100 units of Card Golf Tour. To learn more about Card Golf Tour, visit our website at https://cardgolftour.com/.

\n
\n\"\"\n
\n\n
\n

Meet The Team

\n
\n\"\"\n
\n\n
\n

Nick Sahrmann - Freshman at the University of Kansas

\n
\n\"\"\n
\n\n
\n

Luke Sahrmann - Junior at Olathe West High School

Components

Each copy of Card Golf Tour includes the following items:

\n
\n\"\"\n
\n\n
\n

How To Play

The aim of the game in Card Golf Tour is to shoot par or better (minimize your point total) on each hole (hand) by strategically drawing, matching, keeping, and discarding cards. Card Golf Tour is designed to be played with a group of 2-5 players and will take anywhere from 10-90 minutes based on the amount of hands you play. Listed is below is a brief guide to Card Golf Tour as well as an instructional video on our YouTube channel.

Note: Composition of the deck

Each deck of Card Golf Tour playing cards includes 54 cards. There are 14 types of cards in the deck:

Each type of card has 4 cards in the deck, 2 green cards of the respective type and 2 black cards. The exception to this is the putter card, in which there are only two putters in the deck, one black putter and one green putter (think of the putter as the joker of a standard deck of playing cards).

In Card Golf Tour, the lower the point value of the card, the more valuable that card is. This means that the putter is typically the best card in the deck while the sand wedge is typically the worst card in the deck.

Setup:

Step 1- The dealer will shuffle the deck of cards and then deal. Each player will be dealt 4, 6, or 8 cards face down based on the par of the hole (dealer will reference the scorecard for the par of the hole). 

Step 2- The dealer will then place the remaining cards in the the center of the table, forming the draw pile. The top card of the draw pile will then be turned over and placed next to the draw pile forming the discard pile. 

Step 3- Each player will arrange their cards in two horizontal rows of 2, 3, or 4 cards based on how many cards they were dealt. They will then chose 1, 2, or 3 cards to turn face up based on the amount of cards they were dealt. 

Play:

Step 1- Each player will roll the dice to determine order of play. The lowest roll will be player 1, and the lowest dice roll between the player to the right and left of player 1 will be player 2. Play will then continue in this direction for the remainder of the hole. 

Step 2- Through a series of drawing, matching, keeping, and discarding cards players will attempt to minimize their hands point total (see our instructional video attached below for further explanation of this facet of the game). 

Step 3- Once one player has all of their cards face up on the table, the hand ends and each remaining player is allowed one more turn. 

Score:

Step 1- Each player will find the sum of their hand. 

Step 2- Each player will then find the score to par that their hand total falls under (see our instructional video below for further information on the scoring system in Card Golf Tour). 

Step 3- Each player will then report their score on the hole to the scorekeeper who will keep a running tally of each players score throughout the round.

Note- Each step outlined above will be repeated for each subsequent hand in the game. It is recommended that the group plays either 9 or 18 hands, just like how golfers usually play 9 or 18 holes in a round.

At the conclusion of the game, the player with the lowest score is the winner!

Instructional Video:

\n
\n

What Tour Players Are Saying...

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Stretch Goals

At Card Golf Tour, we have decided not to use stretch goals as a part of our crowdfunding campaign. Our reasoning for this is simple.

We want to ensure that each backer who pledges to the campaign will be able to open their box and immediately begin playing Card Golf Tour. Some Kickstarter campaigns withhold certain components of their game and use them as a reward for a stretch goal. At Card Golf Tour, we have designed our game holistically so that no add-ons are necessary in order to play our game. While we have designed many different ways to play Card Golf Tour, we have decided that we will release these updates to the game at scheduled times throughout the upcoming year to keep the game feeling new and exciting. 

Our team at Card Golf Tour is using our Kickstarter campaign as a proof of concept campaign. We do not intend to make a profit on our product using Kickstarter, but rather, want to use our campaign to spread awareness about our game. Card Golf Tour is a hobby for us, not a job.

Shipping

Our team at Card Golf Tour has made the decision to only ship within the United States. Shipping will be $5 to anywhere within the U.S and no matter the pledge level. 

Backers may notice that we have set March 2024 as our targeted delivery date for our product. This is an unusually short turnaround as our campaign will be ending on February 25th. The reason for this is that we have already produced our first 100 copies of Card Golf Tour. This means that once the campaign ends, assuming it has met its goal, we will be able to immediately begin the process of shipping out our game to backers. While we anticipate that shipping will take 1-2 weeks, we cannot guarantee anything and will make sure to provide continued updates as needed.

\n
\n\"\"\n
\n\n
\n", + "tags": [], + "url": "https://staging.kickstarter.com/projects/cardgolftour/card-golf-tour", + "usdExchangeRate": 1, + "video": { + "__typename": "Video", + "id": "VmlkZW8tMTI1OTU3MQ==", + "videoSources": { + "__typename": "VideoSources", + "high": { + "__typename": "VideoSourceInfo", + "src": "https://v2.kickstarter.com/1712855593-yY8sggPJeOr47xDdQppZMFfUgqaXSUm9RGIGfWLghPo%3D/projects/4683889/video-1259571-h264_high.mp4" + }, + "hls": { + "__typename": "VideoSourceInfo", + "src": "https://v2.kickstarter.com/1712855593-yY8sggPJeOr47xDdQppZMFfUgqaXSUm9RGIGfWLghPo%3D/projects/4683889/video-1259571-hls_playlist.m3u8" } - }, - "watchesCount": 81 - }, - { - "__typename": "Project", - "availableCardTypes": [ - "VISA", - "MASTERCARD", - "AMEX", - "DISCOVER", - "JCB", - "DINERS", - "UNION_PAY" - ], - "backersCount": 26, - "category": { + } + }, + "watchesCount": 81 + }, + { + "__typename": "Project", + "availableCardTypes": [ + "VISA", + "MASTERCARD", + "AMEX", + "DISCOVER", + "JCB", + "DINERS", + "UNION_PAY" + ], + "backersCount": 26, + "category": { + "__typename": "Category", + "id": "Q2F0ZWdvcnktMzU=", + "name": "Video Games", + "analyticsName": "Video Games", + "parentCategory": { "__typename": "Category", - "id": "Q2F0ZWdvcnktMzU=", - "name": "Video Games", - "analyticsName": "Video Games", - "parentCategory": { - "__typename": "Category", - "id": "Q2F0ZWdvcnktMTI=", - "name": "Games", - "analyticsName": "Games" - } + "id": "Q2F0ZWdvcnktMTI=", + "name": "Games", + "analyticsName": "Games" + } + }, + "canComment": true, + "commentsCount": 0, + "country": { + "__typename": "Country", + "code": "US", + "name": "the United States" + }, + "creator": { + "__typename": "User", + "backings": null, + "backingsCount": 0, + "chosenCurrency": null, + "createdProjects": { + "__typename": "UserCreatedProjectsConnection", + "totalCount": 1 }, - "canComment": true, - "commentsCount": 0, - "country": { - "__typename": "Country", - "code": "US", - "name": "the United States" + "email": "s@example.com", + "hasPassword": null, + "hasUnreadMessages": null, + "hasUnseenActivity": null, + "id": "VXNlci0xNDc0MjQ4ODQ1", + "imageUrl": "example.com/image-s", + "isAppleConnected": null, + "isBlocked": false, + "isCreator": null, + "isDeliverable": null, + "isEmailVerified": true, + "isFacebookConnected": false, + "isKsrAdmin": null, + "isFollowing": false, + "isSocializing": null, + "location": { + "__typename": "Location", + "country": "US", + "countryName": "United States", + "displayableName": "New York, NY", + "id": "TG9jYXRpb24tMjQ1OTExNQ==", + "name": "New York" + }, + "name": "S Spider", + "needsFreshFacebookToken": null, + "newsletterSubscriptions": null, + "notifications": null, + "optedOutOfRecommendations": null, + "showPublicProfile": null, + "savedProjects": null, + "storedCards": { + "__typename": "UserCreditCardTypeConnection", + "nodes": [], + "totalCount": 0 }, - "creator": { - "__typename": "User", - "backings": null, - "backingsCount": 0, - "chosenCurrency": null, - "createdProjects": { - "__typename": "UserCreatedProjectsConnection", - "totalCount": 1 + "surveyResponses": null, + "uid": "3" + }, + "currency": "USD", + "deadlineAt": 1710054577, + "description": "A dark style action Soulslike game.", + "environmentalCommitments": [], + "aiDisclosure": { + "__typename": "AiDisclosure", + "id": "QWlEaXNjbG9zdXJlLTM0MDkx", + "fundingForAiAttribution": null, + "fundingForAiConsent": null, + "fundingForAiOption": null, + "generatedByAiConsent": null, + "generatedByAiDetails": null, + "involvesAi": false, + "involvesFunding": false, + "involvesGeneration": false, + "involvesOther": false, + "otherAiDetails": null + }, + "faqs": { + "__typename": "ProjectFaqConnection", + "nodes": [ + { + "__typename": "ProjectFaq", + "question": "Where will the game be released when it is completed?", + "answer": "The currently confirmed platform is Steam, and we will also try to communicate with other platforms.", + "id": "UHJvamVjdEZhcS01MDU2NzQ=", + "createdAt": 1705908260 }, - "email": "s@example.com", - "hasPassword": null, - "hasUnreadMessages": null, - "hasUnseenActivity": null, - "id": "VXNlci0xNDc0MjQ4ODQ1", - "imageUrl": "example.com/image-s", - "isAppleConnected": null, - "isBlocked": false, - "isCreator": null, - "isDeliverable": null, - "isEmailVerified": true, - "isFacebookConnected": false, - "isKsrAdmin": null, - "isFollowing": false, - "isSocializing": null, - "location": { - "__typename": "Location", - "country": "US", - "countryName": "United States", - "displayableName": "New York, NY", - "id": "TG9jYXRpb24tMjQ1OTExNQ==", - "name": "New York" + { + "__typename": "ProjectFaq", + "question": "What languages does the game support?", + "answer": "English, Simplified Chinese, Traditional Chinese, French, Italian, German, Spanish, Japanese and Korean. We will add other languages according to the actual situation.", + "id": "UHJvamVjdEZhcS01MDU2NzU=", + "createdAt": 1705908260 }, - "name": "S Spider", - "needsFreshFacebookToken": null, - "newsletterSubscriptions": null, - "notifications": null, - "optedOutOfRecommendations": null, - "showPublicProfile": null, - "savedProjects": null, - "storedCards": { - "__typename": "UserCreditCardTypeConnection", - "nodes": [], - "totalCount": 0 + { + "__typename": "ProjectFaq", + "question": "How long is the game approximately?", + "answer": "The current plan is that the main plot of the week will last about 20 hours.", + "id": "UHJvamVjdEZhcS01MDU2NzY=", + "createdAt": 1705908260 }, - "surveyResponses": null, - "uid": "3" - }, + { + "__typename": "ProjectFaq", + "question": "What is the difference between Digital Standard Edition and Digital Special Edition?", + "answer": "The special edition will have three additional sets of equipment that will not affect game balance.", + "id": "UHJvamVjdEZhcS01MDU2Nzg=", + "createdAt": 1705909197 + }, + { + "__typename": "ProjectFaq", + "question": "What stage is the game development currently at?", + "answer": "The game is currently in the early development stage, and we really want to complete the game, so we want to do it through crowdfunding. Please believe that we have the ability to do it well.", + "id": "UHJvamVjdEZhcS01MDU2Nzk=", + "createdAt": 1705909197 + }, + { + "__typename": "ProjectFaq", + "question": "If the crowdfunding goal is exceeded, where will you use the funds?", + "answer": "In addition to the basic expenses, additional funds will appropriately extend the plot content while ensuring the quality of the game, as well as more types of monsters and weapons.", + "id": "UHJvamVjdEZhcS01MDU2ODA=", + "createdAt": 1705909197 + } + ] + }, + "finalCollectionDate": null, + "fxRate": 1, + "goal": { + "__typename": "Money", + "amount": "20000.0", "currency": "USD", - "deadlineAt": 1710054577, - "description": "A dark style action Soulslike game.", - "environmentalCommitments": [], - "aiDisclosure": { - "__typename": "AiDisclosure", - "id": "QWlEaXNjbG9zdXJlLTM0MDkx", - "fundingForAiAttribution": null, - "fundingForAiConsent": null, - "fundingForAiOption": null, - "generatedByAiConsent": null, - "generatedByAiDetails": null, - "involvesAi": false, - "involvesFunding": false, - "involvesGeneration": false, - "involvesOther": false, - "otherAiDetails": null - }, - "faqs": { - "__typename": "ProjectFaqConnection", - "nodes": [ - { - "__typename": "ProjectFaq", - "question": "Where will the game be released when it is completed?", - "answer": "The currently confirmed platform is Steam, and we will also try to communicate with other platforms.", - "id": "UHJvamVjdEZhcS01MDU2NzQ=", - "createdAt": 1705908260 - }, - { - "__typename": "ProjectFaq", - "question": "What languages does the game support?", - "answer": "English, Simplified Chinese, Traditional Chinese, French, Italian, German, Spanish, Japanese and Korean. We will add other languages according to the actual situation.", - "id": "UHJvamVjdEZhcS01MDU2NzU=", - "createdAt": 1705908260 - }, - { - "__typename": "ProjectFaq", - "question": "How long is the game approximately?", - "answer": "The current plan is that the main plot of the week will last about 20 hours.", - "id": "UHJvamVjdEZhcS01MDU2NzY=", - "createdAt": 1705908260 - }, - { - "__typename": "ProjectFaq", - "question": "What is the difference between Digital Standard Edition and Digital Special Edition?", - "answer": "The special edition will have three additional sets of equipment that will not affect game balance.", - "id": "UHJvamVjdEZhcS01MDU2Nzg=", - "createdAt": 1705909197 - }, - { - "__typename": "ProjectFaq", - "question": "What stage is the game development currently at?", - "answer": "The game is currently in the early development stage, and we really want to complete the game, so we want to do it through crowdfunding. Please believe that we have the ability to do it well.", - "id": "UHJvamVjdEZhcS01MDU2Nzk=", - "createdAt": 1705909197 - }, - { - "__typename": "ProjectFaq", - "question": "If the crowdfunding goal is exceeded, where will you use the funds?", - "answer": "In addition to the basic expenses, additional funds will appropriately extend the plot content while ensuring the quality of the game, as well as more types of monsters and weapons.", - "id": "UHJvamVjdEZhcS01MDU2ODA=", - "createdAt": 1705909197 - } - ] - }, - "finalCollectionDate": null, - "fxRate": 1, - "goal": { - "__typename": "Money", - "amount": "20000.0", - "currency": "USD", - "symbol": "$" - }, - "image": { - "__typename": "Photo", - "id": "UGhvdG8tNDM3MzYwMDM=", - "url": "https://i-dev.kickstarter.com/assets/043/736/003/8769ec8848c1a1c861094b6425ae2630_original.png?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=jtbq4V3FiH5vDWBz8VsiX%2Fg8eCZojAsTyqTU31dRfL0%3D" - }, - "isProjectWeLove": false, - "isProjectOfTheDay": false, - "isInPostCampaignPledgingPhase": false, - "isWatched": false, - "isLaunched": true, - "launchedAt": 1706166577, - "location": { - "__typename": "Location", - "country": "CN", - "countryName": "China", - "displayableName": "Shanghai, China", - "id": "TG9jYXRpb24tMjE1MTg0OQ==", - "name": "Shanghai" - }, - "maxPledge": 10000, - "minPledge": 1, - "name": "ShadowKnight", - "pid": 98154754, - "pledged": { - "__typename": "Money", - "amount": "7309.0", - "currency": "USD", - "symbol": "$" - }, - "posts": { - "__typename": "PostConnection", - "totalCount": 1 - }, - "prelaunchActivated": true, - "postCampaignPledgingEnabled": false, - "risks": "The core concept of \"ShadowKnight\" aims to provide players with an unprecedented and challenging gaming experience. Our goal is to transcend the boundaries of traditional action games by introducing innovative soul-possession mechanics and a complex combat system. This ambitious objective brings significant technical and design challenges. To achieve this vision, our team is committed to relentless effort, continuous innovation, and refinement, ensuring the balance of game mechanics and the coherence of the story.\nOur team faces certain limitations in art and animation. High-quality visuals are a key factor in attracting players, especially in action soul games, where exquisite graphics and smooth animations are crucial. We recognize this and are actively seeking partnerships and external resources to address this shortcoming. We are dedicated to ensuring that the game's visuals meet industry standards, providing players with an immersive gaming experience.\nTo realize the highly interactive and dynamic combat scenes envisioned in \"ShadowKnight\", complex and advanced programming techniques are required. The challenge lies in accurately implementing the game's intricate state system and high-intelligence AI, while maintaining the game's fluidity and stability. Our team is facing the need for innovation and breakthroughs at the technical level.\nIn the end, no matter how much we raise, we will deliver.", - "sendMetaCapiEvents": false, - "slug": "soulightninggame/shadowknight", - "state": "LIVE", - "stateChangedAt": 1706166580, - "story": "

\"ShadowKnight\" is a Soulslike action game. The story unfolds in a mysterious and perilous unknown territory, where a small squad of brave knights encounters unknown monsters, leading to a catastrophic defeat. The protagonist, the lone survivor, unexpectedly gains a mystical power from wearing Pazuzu's possession talisman. After the monsters depart, you discover a unique ability: you can use your soul to inhabit the bodies of the deceased. You will use your soul to choose a new body (different professions) from your team to begin the journey of escaping this uncharted domain.

Game Features

Unique Possession Mechanism

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Body Diversity and Combat Variability

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Intelligent AI and Diverse Enemies

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Multiple Endings and Story Depth

\n
\n\"\"\n
\n\n
\n

Interactive Combat Scenes

Combat Mechanics

Complex State System

Rich Attack Types and Tactical Choices

Unique Guard-Breaking Attacks and Combat Interactions

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

JoinUs

Discord:rgTdaX8kSV

Twitter:SoulightningGameStudio (@_Soulightning_) / X (twitter.com)

", - "tags": [], - "url": "https://staging.kickstarter.com/projects/soulightninggame/shadowknight", - "usdExchangeRate": 1, - "video": { - "__typename": "Video", - "id": "VmlkZW8tMTI3MDE1MA==", - "videoSources": { - "__typename": "VideoSources", - "high": { - "__typename": "VideoSourceInfo", - "src": "https://v2.kickstarter.com/1712855593-dzSyV%2BCn8XeqNL3tpEjsK1FVWaZINGR%2FDSvPu6ez4Ec%3D/projects/4713986/video-1270150-h264_high.mp4" - }, - "hls": { - "__typename": "VideoSourceInfo", - "src": "https://v2.kickstarter.com/1712855593-dzSyV%2BCn8XeqNL3tpEjsK1FVWaZINGR%2FDSvPu6ez4Ec%3D/projects/4713986/video-1270150-hls_playlist.m3u8" - } + "symbol": "$" + }, + "image": { + "__typename": "Photo", + "id": "UGhvdG8tNDM3MzYwMDM=", + "url": "https://i-dev.kickstarter.com/assets/043/736/003/8769ec8848c1a1c861094b6425ae2630_original.png?anim=false&fit=crop&gravity=auto&height=576&origin=ugc-qa&q=92&width=1024&sig=jtbq4V3FiH5vDWBz8VsiX%2Fg8eCZojAsTyqTU31dRfL0%3D" + }, + "isProjectWeLove": false, + "isProjectOfTheDay": false, + "isInPostCampaignPledgingPhase": false, + "isWatched": false, + "isLaunched": true, + "launchedAt": 1706166577, + "location": { + "__typename": "Location", + "country": "CN", + "countryName": "China", + "displayableName": "Shanghai, China", + "id": "TG9jYXRpb24tMjE1MTg0OQ==", + "name": "Shanghai" + }, + "maxPledge": 10000, + "minPledge": 1, + "name": "ShadowKnight", + "pid": 98154754, + "pledged": { + "__typename": "Money", + "amount": "7309.0", + "currency": "USD", + "symbol": "$" + }, + "posts": { + "__typename": "PostConnection", + "totalCount": 1 + }, + "prelaunchActivated": true, + "postCampaignPledgingEnabled": false, + "risks": "The core concept of \"ShadowKnight\" aims to provide players with an unprecedented and challenging gaming experience. Our goal is to transcend the boundaries of traditional action games by introducing innovative soul-possession mechanics and a complex combat system. This ambitious objective brings significant technical and design challenges. To achieve this vision, our team is committed to relentless effort, continuous innovation, and refinement, ensuring the balance of game mechanics and the coherence of the story.\nOur team faces certain limitations in art and animation. High-quality visuals are a key factor in attracting players, especially in action soul games, where exquisite graphics and smooth animations are crucial. We recognize this and are actively seeking partnerships and external resources to address this shortcoming. We are dedicated to ensuring that the game's visuals meet industry standards, providing players with an immersive gaming experience.\nTo realize the highly interactive and dynamic combat scenes envisioned in \"ShadowKnight\", complex and advanced programming techniques are required. The challenge lies in accurately implementing the game's intricate state system and high-intelligence AI, while maintaining the game's fluidity and stability. Our team is facing the need for innovation and breakthroughs at the technical level.\nIn the end, no matter how much we raise, we will deliver.", + "sendMetaCapiEvents": false, + "slug": "soulightninggame/shadowknight", + "state": "LIVE", + "stateChangedAt": 1706166580, + "story": "

\"ShadowKnight\" is a Soulslike action game. The story unfolds in a mysterious and perilous unknown territory, where a small squad of brave knights encounters unknown monsters, leading to a catastrophic defeat. The protagonist, the lone survivor, unexpectedly gains a mystical power from wearing Pazuzu's possession talisman. After the monsters depart, you discover a unique ability: you can use your soul to inhabit the bodies of the deceased. You will use your soul to choose a new body (different professions) from your team to begin the journey of escaping this uncharted domain.

Game Features

Unique Possession Mechanism

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Body Diversity and Combat Variability

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Intelligent AI and Diverse Enemies

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

Multiple Endings and Story Depth

\n
\n\"\"\n
\n\n
\n

Interactive Combat Scenes

Combat Mechanics

Complex State System

Rich Attack Types and Tactical Choices

Unique Guard-Breaking Attacks and Combat Interactions

\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n
\n
\n\"\"\n
\n\n
\n

JoinUs

Discord:rgTdaX8kSV

Twitter:SoulightningGameStudio (@_Soulightning_) / X (twitter.com)

", + "tags": [], + "url": "https://staging.kickstarter.com/projects/soulightninggame/shadowknight", + "usdExchangeRate": 1, + "video": { + "__typename": "Video", + "id": "VmlkZW8tMTI3MDE1MA==", + "videoSources": { + "__typename": "VideoSources", + "high": { + "__typename": "VideoSourceInfo", + "src": "https://v2.kickstarter.com/1712855593-dzSyV%2BCn8XeqNL3tpEjsK1FVWaZINGR%2FDSvPu6ez4Ec%3D/projects/4713986/video-1270150-h264_high.mp4" + }, + "hls": { + "__typename": "VideoSourceInfo", + "src": "https://v2.kickstarter.com/1712855593-dzSyV%2BCn8XeqNL3tpEjsK1FVWaZINGR%2FDSvPu6ez4Ec%3D/projects/4713986/video-1270150-hls_playlist.m3u8" } - }, - "watchesCount": 21 - } - ], - "pageInfo": { - "__typename": "PageInfo", - "hasNextPage": false, - "endCursor": "WzE3MjYxMDM3NV0=", - "hasPreviousPage": false, - "startCursor": "WzE3MjYxMTU4Nl0=" + } + }, + "watchesCount": 21 } - } + ], + "pageInfo": { + "__typename": "PageInfo", + "hasNextPage": false, + "endCursor": "WzE3MjYxMDM3NV0=", + "hasPreviousPage": false, + "startCursor": "WzE3MjYxMTU4Nl0=" + }, + "totalCount": 3 } } } diff --git a/KsApi/queries/templates/FetchMyBackedProjectsQueryRequestForTests.graphql_test b/KsApi/queries/templates/FetchMyBackedProjectsQueryRequestForTests.graphql_test index ca30b40a99..debed8130c 100644 --- a/KsApi/queries/templates/FetchMyBackedProjectsQueryRequestForTests.graphql_test +++ b/KsApi/queries/templates/FetchMyBackedProjectsQueryRequestForTests.graphql_test @@ -1,10 +1,8 @@ query FetchMyBackedProjects($first: Int, $after: String) { - me { + __typename + projects(first: $first, after: $after, backed: true, sort: END_DATE)) { __typename - backingsCount - backedProjects(first: $first, after: $after) { - __typename - nodes { + nodes { __typename availableCardTypes