diff --git a/app/graphql/types/user_type.rb b/app/graphql/types/user_type.rb index 24b3209..a8c16bd 100644 --- a/app/graphql/types/user_type.rb +++ b/app/graphql/types/user_type.rb @@ -9,5 +9,16 @@ module Types field :email, String, null: false field :roles, [Enums::RoleEnum], null: false field :avatar_url, String, null: true + + field :inactive_review_requests, Types::ReviewRequestType.connection_type, null: false + field :active_review_requests, Types::ReviewRequestType.connection_type, null: false + + def inactive_review_requests + object.review_requests.inactive + end + + def active_review_requests + object.review_requests.active + end end end diff --git a/app/javascript/__generated__/graphql-schema.ts b/app/javascript/__generated__/graphql-schema.ts index 5aec043..db76e2d 100644 --- a/app/javascript/__generated__/graphql-schema.ts +++ b/app/javascript/__generated__/graphql-schema.ts @@ -402,6 +402,35 @@ export type ReviewMessageInput = { text: Scalars['String']; }; +export type ReviewRequest = { + __typename?: 'ReviewRequest'; + answered: Scalars['Boolean']; + id: Scalars['ID']; + question: Question; + user: User; +}; + +/** The connection type for ReviewRequest. */ +export type ReviewRequestConnection = { + __typename?: 'ReviewRequestConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + totalCount: Scalars['Int']; +}; + +/** An edge in a connection. */ +export type ReviewRequestEdge = { + __typename?: 'ReviewRequestEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + export type Subject = { __typename?: 'Subject'; axis: Axis; @@ -460,13 +489,31 @@ export type UpdateQuestionPayload = { export type User = { __typename?: 'User'; + activeReviewRequests: ReviewRequestConnection; avatarUrl?: Maybe; email: Scalars['String']; id: Scalars['ID']; + inactiveReviewRequests: ReviewRequestConnection; name: Scalars['String']; roles: Array; }; + +export type UserActiveReviewRequestsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type UserInactiveReviewRequestsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + /** The connection type for User. */ export type UserConnection = { __typename?: 'UserConnection'; diff --git a/app/javascript/__generated__/schema.graphql b/app/javascript/__generated__/schema.graphql index cff7616..5b0266a 100644 --- a/app/javascript/__generated__/schema.graphql +++ b/app/javascript/__generated__/schema.graphql @@ -526,6 +526,49 @@ input ReviewMessageInput { text: String! } +type ReviewRequest { + answered: Boolean! + id: ID! + question: Question! + user: User! +} + +""" +The connection type for ReviewRequest. +""" +type ReviewRequestConnection { + """ + A list of edges. + """ + edges: [ReviewRequestEdge!]! + + """ + A list of nodes. + """ + nodes: [ReviewRequest!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + totalCount: Int! +} + +""" +An edge in a connection. +""" +type ReviewRequestEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of the edge. + """ + node: ReviewRequest +} + type Subject { axis: Axis! category: Category! @@ -619,9 +662,51 @@ type UpdateQuestionPayload { } type User { + activeReviewRequests( + """ + Returns the elements in the list that come after the specified cursor. + """ + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """ + Returns the first _n_ elements from the list. + """ + first: Int + + """ + Returns the last _n_ elements from the list. + """ + last: Int + ): ReviewRequestConnection! avatarUrl: String email: String! id: ID! + inactiveReviewRequests( + """ + Returns the elements in the list that come after the specified cursor. + """ + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """ + Returns the first _n_ elements from the list. + """ + first: Int + + """ + Returns the last _n_ elements from the list. + """ + last: Int + ): ReviewRequestConnection! name: String! roles: [UserRole!]! } diff --git a/app/javascript/pages/question/List/QuestionsWaitingReviewQuery.tsx b/app/javascript/pages/question/List/QuestionsWaitingReviewQuery.tsx index 9239d82..b6de835 100644 --- a/app/javascript/pages/question/List/QuestionsWaitingReviewQuery.tsx +++ b/app/javascript/pages/question/List/QuestionsWaitingReviewQuery.tsx @@ -34,8 +34,9 @@ export const QuestionsWaitingReviewQuery: FC = ({ title }) => { const [pageInfo, setPageInfo] = useState() const updateQuestions = (queryResult: Query) => { - const { currentUser } = queryResult - const { activeReviewRequests } = currentUser as User + if (!queryResult.currentUser) return + + const { activeReviewRequests } = queryResult.currentUser const reviewRequests = activeReviewRequests.nodes as ReviewRequest[] setQuestions(reviewRequests.map(item => item.question)) diff --git a/app/models/review_request.rb b/app/models/review_request.rb index f013b56..c5154f5 100644 --- a/app/models/review_request.rb +++ b/app/models/review_request.rb @@ -22,4 +22,7 @@ class ReviewRequest < ApplicationRecord belongs_to :question belongs_to :user + + scope :active, -> { where(answered: false) } + scope :inactive, -> { where(answered: true) } end diff --git a/app/models/user.rb b/app/models/user.rb index 6893bc1..62a8d45 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -24,6 +24,8 @@ class User < ApplicationRecord include Trashable extend Enumerize + has_many :review_requests, dependent: :destroy + devise :database_authenticatable, :recoverable, :rememberable,