import { BaseResource } from '@gitbeaker/requester-utils'; import { RequestHelper, endpoint } from '../infrastructure'; import type { GitlabAPIResponse, MappedOmit, ShowExpanded, Sudo } from '../infrastructure'; import type { SimpleUserSchema } from './Users'; import type { GroupSchema } from './Groups'; import type { ProtectedBranchSchema } from './ProtectedBranches'; export interface ProjectLevelMergeRequestApprovalSchema extends Record { approvals_before_merge: number; reset_approvals_on_push: boolean; disable_overriding_approvers_per_merge_request: boolean; merge_requests_author_approval: boolean; merge_requests_disable_committers_approval: boolean; require_password_to_approve: boolean; } export interface ApprovedByEntity { user: MappedOmit; } export interface MergeRequestLevelMergeRequestApprovalSchema extends Record { id: number; iid: number; project_id: number; title: string; description: string; state: string; created_at: string; updated_at: string; merge_status: string; approvals_required: number; approvals_left: number; approved_by?: ApprovedByEntity[]; } export interface ApprovalRuleSchema extends Record { id: number; name: string; rule_type: string; eligible_approvers?: MappedOmit[]; approvals_required: number; users?: MappedOmit[]; groups?: GroupSchema[]; contains_hidden_groups: boolean; overridden: boolean; } export interface ProjectLevelApprovalRuleSchema extends ApprovalRuleSchema { protected_branches?: ProtectedBranchSchema[]; } export interface MergeRequestLevelApprovalRuleSchema extends ApprovalRuleSchema { source_rule?: string; } export interface ApprovalStateSchema extends Record { approval_rules_overwritten: boolean; rules: ({ approved: boolean } & MergeRequestLevelApprovalRuleSchema)[]; } export type CreateApprovalRuleOptions = { userIds?: number[]; groupIds?: number[]; protectedBranchIds?: number[]; appliesToAllProtectedBranches?: boolean; reportType?: string; ruleType?: string; usernames?: string[]; }; export type EditApprovalRuleOptions = { userIds?: number[]; groupIds?: number[]; protectedBranchIds?: number[]; appliesToAllProtectedBranches?: boolean; usernames?: string[]; removeHiddenGroups?: boolean; }; export type EditConfigurationOptions = { disableOverridingApproversPerMergeRequest?: boolean; mergeRequestsAuthorApproval?: boolean; mergeRequestsDisableCommittersApproval?: boolean; requirePasswordToApprove?: boolean; resetApprovalsOnPush?: boolean; selectiveCodeOwnerRemovals?: boolean; }; export class MergeRequestApprovals extends BaseResource { allApprovalRules( projectId: string | number, options: { mergerequestIId: number } & Sudo & ShowExpanded, ): Promise>; allApprovalRules( projectId: string | number, options?: Sudo & ShowExpanded, ): Promise>; allApprovalRules( projectId: string | number, { mergerequestIId, ...options }: { mergerequestIId?: number } & Sudo & ShowExpanded = {}, ): Promise< GitlabAPIResponse< (ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema)[], C, E, void > > { let url: string; if (mergerequestIId) { url = endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approval_rules`; } else { url = endpoint`projects/${projectId}/approval_rules`; } return RequestHelper.get< (ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema)[] >()(this, url, options); } approve( projectId: string | number, mergerequestIId: number, options?: { sha?: string; approvalPassword?: string } & Sudo & ShowExpanded, ) { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approve`, options, ); } createApprovalRule( projectId: string | number, name: string, approvalsRequired: number, options: { mergerequestIId: number } & CreateApprovalRuleOptions & Sudo & ShowExpanded, ): Promise>; createApprovalRule( projectId: string | number, name: string, approvalsRequired: number, options?: CreateApprovalRuleOptions & Sudo & ShowExpanded, ): Promise>; createApprovalRule( projectId: string | number, name: string, approvalsRequired: number, { mergerequestIId, ...options }: { mergerequestIId?: number } & CreateApprovalRuleOptions & Sudo & ShowExpanded = {}, ): Promise< GitlabAPIResponse< ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema, C, E, void > > { let url: string; if (mergerequestIId) { url = endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approval_rules`; } else { url = endpoint`projects/${projectId}/approval_rules`; } return RequestHelper.post< ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema >()(this, url, { name, approvalsRequired, ...options }); } editApprovalRule( projectId: string | number, approvalRuleId: number, name: string, approvalsRequired: number, options: { mergerequestIId: number } & EditApprovalRuleOptions & Sudo & ShowExpanded, ): Promise>; editApprovalRule( projectId: string | number, approvalRuleId: number, name: string, approvalsRequired: number, options?: EditApprovalRuleOptions & Sudo & ShowExpanded, ): Promise>; editApprovalRule( projectId: string | number, approvalRuleId: number, name: string, approvalsRequired: number, { mergerequestIId, ...options }: { mergerequestIId?: number } & EditApprovalRuleOptions & Sudo & ShowExpanded = {}, ): Promise< GitlabAPIResponse< ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema, C, E, void > > { let url: string; if (mergerequestIId) { url = endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approval_rules/${approvalRuleId}`; } else { url = endpoint`projects/${projectId}/approval_rules/${approvalRuleId}`; } return RequestHelper.put< ProjectLevelApprovalRuleSchema | MergeRequestLevelApprovalRuleSchema >()(this, url, { name, approvalsRequired, ...options }); } editConfiguration( projectId: string | number, options?: EditConfigurationOptions & Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/approvals`, options, ); } removeApprovalRule( projectId: string | number, approvalRuleId: number, { mergerequestIId, ...options }: { mergerequestIId?: number } & Sudo & ShowExpanded = {} as any, ): Promise> { let url: string; if (mergerequestIId) { url = endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approval_rules/${approvalRuleId}`; } else { url = endpoint`projects/${projectId}/approval_rules/${approvalRuleId}`; } return RequestHelper.del()(this, url, options); } showApprovalRule( projectId: string | number, approvalRuleId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/approval_rules/${approvalRuleId}`, options, ); } showApprovalState( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approval_state`, options, ); } showConfiguration( projectId: string | number, options: { mergerequestIId: number } & Sudo & ShowExpanded, ): Promise>; showConfiguration( projectId: string | number, options?: Sudo & ShowExpanded, ): Promise>; showConfiguration( projectId: string | number, { mergerequestIId, ...options }: { mergerequestIId?: number } & Sudo & ShowExpanded = {}, ): Promise< GitlabAPIResponse< MergeRequestLevelMergeRequestApprovalSchema | ProjectLevelMergeRequestApprovalSchema, C, E, void > > { let url: string; if (mergerequestIId) { url = endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/approvals`; } else { url = endpoint`projects/${projectId}/approvals`; } return RequestHelper.get< MergeRequestLevelMergeRequestApprovalSchema | ProjectLevelMergeRequestApprovalSchema >()(this, url, options); } unapprove( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/unapprove`, options, ); } }