Skip to content

GraphQL query & mutations for virtual registry upstreams

Everyone can contribute. Help move this issue forward while earning points, leveling up and collecting rewards.

Summary

We need to implement GraphQL query and mutations for CRUD operations on Maven virtual registry upstreams. These operations will allow users to manage Maven-specific upstream configurations through the GraphQL API.

Background

This issue is related to parent epic gitlab-org#15090 and designs are proposed in #493842 (closed). This implementation focuses specifically on Maven package registry upstreams.

Progress Status

Completed

  • GraphQL Query - Implemented in !205320 (merged) (merged in 18.6)

    • mavenVirtualRegistryUpstreams: Fetch upstreams for a Maven virtual registry with pagination support
    • Search functionality by upstream name
    • Proper permissions and authorization checks
  • Create Mutation - Implemented in !194371 (merged) (merged in 18.2)

    • createMavenVirtualRegistryUpstream: Create a new Maven upstream
    • Support for all required and optional fields
    • Proper validation and error handling

🔄 Remaining Work

  • Update Mutation - updateMavenVirtualRegistryUpstream: Update an existing Maven upstream
  • Delete Mutation - deleteMavenVirtualRegistryUpstream: Delete a Maven upstream

Data Model

A Maven virtual registry upstream contains:

  • Name
  • URL (Maven repository URL)
  • Cache expiration period (in hours)
  • Optional username
  • Optional password
  • Association with a Maven virtual registry (via virtual registry ID)

Required GraphQL Operations

Query COMPLETED

  • mavenVirtualRegistryUpstreams: Fetch upstreams for a Maven virtual registry with pagination support
    • Input: Maven virtual registry ID, pagination parameters
    • Output: List of Maven upstreams with their attributes
type MavenVirtualRegistryUpstream {
  id: ID!
  name: String!
  url: String!
  cacheExpirationPeriodHours: Int!
  username: String
  # password is not returned for security reasons
  virtualRegistryId: ID!
  position: Int!
  createdAt: Time!
  updatedAt: Time!

  # Cache metrics
  cachedResponsesCount: Int!
  cacheSizeBytes: Int!
}

type MavenVirtualRegistryUpstreamConnection {
  nodes: [MavenVirtualRegistryUpstream]
  pageInfo: PageInfo!
}

extend type Query {
  mavenVirtualRegistryUpstreams(
    virtualRegistryId: ID!
    after: String
    before: String
    first: Int
    last: Int
  ): MavenVirtualRegistryUpstreamConnection!
}

Mutations

Create COMPLETED

  • createMavenVirtualRegistryUpstream: Create a new Maven upstream
input CreateMavenVirtualRegistryUpstreamInput {
  virtualRegistryId: ID!
  name: String!
  url: String!
  cacheExpirationPeriodHours: Int!
  username: String
  password: String
}

type CreateMavenVirtualRegistryUpstreamPayload {
  upstream: MavenVirtualRegistryUpstream
  errors: [Error!]!
}

Update & Delete 🔄 IN PROGRESS

  • updateMavenVirtualRegistryUpstream: Update an existing Maven upstream
  • deleteMavenVirtualRegistryUpstream: Delete a Maven upstream
input UpdateMavenVirtualRegistryUpstreamInput {
  id: ID!
  name: String
  url: String
  cacheExpirationPeriodHours: Int
  username: String
  password: String
}

type UpdateMavenVirtualRegistryUpstreamPayload {
  upstream: MavenVirtualRegistryUpstream
  errors: [Error!]!
}

input DeleteMavenVirtualRegistryUpstreamInput {
  id: ID!
}

type DeleteMavenVirtualRegistryUpstreamPayload {
  errors: [Error!]!
}

extend type Mutation {
  createMavenVirtualRegistryUpstream(
    input: CreateMavenVirtualRegistryUpstreamInput!
  ): CreateMavenVirtualRegistryUpstreamPayload

  updateMavenVirtualRegistryUpstream(
    input: UpdateMavenVirtualRegistryUpstreamInput!
  ): UpdateMavenVirtualRegistryUpstreamPayload

  deleteMavenVirtualRegistryUpstream(
    input: DeleteMavenVirtualRegistryUpstreamInput!
  ): DeleteMavenVirtualRegistryUpstreamPayload
}

Sub-tasks

Edited by Rahul Chanila