Add "restore version as new latest" with deprecation support for AI Catalog items

Summary

Allow item owners to restore an older released version as a new latest version, with the ability to mark the replaced version as deprecated. Deprecated versions are excluded from consumer version selection.

Parent issue: gitlab-org/gitlab#596982

Changes

DB migration

  • Add deprecated boolean column to ai_catalog_item_versions (default: false, not null)

Model (ee/app/models/ai/catalog/item_version.rb)

  • Add scopes: not_deprecated, released
  • Allow updating deprecated on released versions (bypass validate_readonly for this field)

GraphQL schema

  • Expose deprecated field on VersionInterface
  • Add optional exclude_deprecated filter to ItemVersionsFinder

New service: Ai::Catalog::ItemVersions::RestoreService

  • Copy definition and schema_version from source version into a new version record
  • Bump version number (minor) from latest released
  • Set release_date, created_by, update latest_version and latest_released_version on item
  • Optionally mark current latest as deprecated (default: true)
  • Wrap in transaction

New GraphQL mutation: AiCatalogItemVersionRestore

  • Arguments: id (version to restore from), deprecate_current (boolean, default true)
  • Returns: newly created ItemVersion
  • Authorization: admin_ai_catalog_item (Maintainer/Owner of owning project)

Audit events

  • Add relevant audit events
Edited by 🤖 GitLab Bot 🤖