Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Specification

Code Block
languagejs
titleGraphQL schema
collapsetrue
"""
Methods to use when ordering `Merge Request`.
"""
enum MergeRequestOrderBy {
  "Sort Person by inserted at in ascending order."
  INSERTED_AT_ASC
  "Sort Person by inserted at in descending order."
  INSERTED_AT_DESC
  "Sort Person by birth date in ascending order."
  STATUS_ASC
  "Sort Person by birth date in descending order."
  STATUS_DESC
}

"""
A connection to a list of `MergeRequest` values.
"""
type MergeRequestConnection {
  "Information to aid in pagination."
  pageInfo: PageInfo!
  "Flag which shows whether NEW merge candidate can be assigned to the User"
  canAssignNew: Boolean!
  "A list of nodes."
  nodes: [MergeRequest]
  "A list of edges."
  edges: [MergeRequestEdge]
}

"""
Reads and enables pagination through a set of `MergeRequest`.
"""
type MergeRequestEdge {
  "The item at the end of the edge."
  node: MergeRequest!
  "A cursor for use in pagination."
  cursor: String!
}

"""
Return type for `assignMergeCandidate` mutation.
"""
type AssignMergeCandidatePayload {
  "Information of pair of persons which can be same."
  mergeRequest: MergeRequest!
}

"""
Input for `updateMergeRequest` mutation.
In order to update status user must have a scope `merge_request:write`
"""
input UpdateMergeRequestInput {
  "Primary key identifier from the database"
  id: ID!
  "next status of merge request"
  status: MergeRequestStatus!
  "comment which user can leave"
  comment: String
}

"""
Return type for `updateMergeRequest` mutation.
"""
type UpdateMergeRequestPayload {
  "Information of pair of persons which can be same."
  mergeRequest: MergeRequest!
}

"""
This is Merge Request details. In order to obtain details user must have a scope **merge_request:read**
"""
type MergeRequest implements Node {
  "The ID of an object"
  id: ID!
  "Primary key identifier from the database"
  databaseId: UUID!
  "The pair of persons which is considerated to be the same person"
  manualMergeCandidate: ManualMergeCandidate!
  "status of merge request"
  status: MergeRequestStatus!
  "comment which user can leave"
  comment: String
  "Technical information when the patient was inserted into the DB."
  insertedAt: DateTime!
  "Technical information when the patient was updated in the DB."
  updatedAt: DateTime!
}

"""
List of MergeRequest statuses.
"""
enum MergeRequestStatus {
  "Status `MERGE` for a merge request"
  MERGE
  "Status `NEW` for a merge request"
  NEW
  "Status `POSTPONE` for a merge request"
  POSTPONE
  "Status `SPLIT` for a merge request"
  SPLIT
  "Status `TRASH` for a merge request"
  TRASH
}

"""
Information about Manual Merge Candidate.
"""
type ManualMergeCandidate {
  "The ID of an object"
  id: ID!
  "Primary key identifier from the database"
  databaseId: UUID!
  "The pair of persons which is considerated to be the same person"
  mergeCandidate: MergeCandidate!
  "status of merge candidate"
  status: ManualMergeCandidateStatus
  "Technical information when the patient was inserted into the DB."
  insertedAt: DateTime!
  "Technical information when the patient was updated in the DB."
  updatedAt: DateTime!
}

"""
Information about Merge Candidate.
"""
type MergeCandidate {
  "The ID of an object"
  id: ID!
  "Primary key identifier from the database"
  databaseId: UUID!
  "The person wich will be deactivated"
  person: Person!
  "The person wich will remain"
  masterPerson: Person!
}

"""
List of Merge candidate statuses
"""
enum ManualMergeCandidateStatus {
  "Status `NEW` for a merge request"
  NEW
  "Status `PROCESSED` for a merge request"
  PROCESSED
}

...

    1. Verify the validity of access token
      1. in case of error return 401 ('Access denied')
    2. Check user scope merge_candidate:assign in order to perform this action
      1. in case of error generate 401 response ('Invalid scopes')

Verify role

Extract from token:

...

  1. Priority by records which already has some decisions 
    1. join table  manual_merge_requests on manual_merge_requests.merge_candidate_id=manual_merge_candidates.merge_candidate_id and manual_merge_requests.assignee_id<>$user_id
    2. choose manual_merge_requests.merge_candidate_id  order by  count() DESC
  2. manual_merge_candidate must satisfy constraint: merge_candidate_id+assignee_id in table manual_merge_requests


Validate request

  1. Check whether this user doesn't have other merge_requests in status='NEW'
    1. check manual_merge_requests by assignee_id=$user_id and status='NEW'
      1. in case of error return conflict error 'CONFLICT' - 'Assignee is not allowed to ask for new merge request'
  2. Check amount of postponed merge_requests for current employee_id
    1. check qty from manual_merge_requests by assignee_id=$user_id and status='POSTPONED'
      1. in case of qty<postponed_requests_limit return conflict error 'CONFLICT' - 'Assignee reached limit in postponed merge_requests'
  3. Check there is no record for merge_candidate_id+assignee_id  and whether merge_candidate_id can be reviewed
    1. verify merge_candidate_id has status NEW and assignee_id is null in table manual_merge_candidates. in table manual_merge_requests shouldn't be a record with condition merge_candidate_id+$user_id
      1. in case there is no merge candidate in status NEW which wasn't verified by $user_id return 204 No content


Update assignee for merge_candidate

  1. Update assignee_id in manual_merge_candidates  to $user_id
  2. Update updated_at = now()
  3. Update updated_at = $user_id

manual_merge_candidates

Field Value
assignee_id$user_id
updated_atnow()


Make merge_request for assignee

...