From a38a79f5242d7ed839db7a508e903598cf51cfbb Mon Sep 17 00:00:00 2001 From: theknut Date: Mon, 21 Jul 2025 16:37:23 +0200 Subject: [PATCH 1/2] feat: add missing project properties --- NGitLab/Models/ContainerExpirationPolicy.cs | 26 +++ NGitLab/Models/Project.cs | 179 +++++++++++++++++++- NGitLab/Models/RepositoryAccessLevel.cs | 3 +- 3 files changed, 200 insertions(+), 8 deletions(-) create mode 100644 NGitLab/Models/ContainerExpirationPolicy.cs diff --git a/NGitLab/Models/ContainerExpirationPolicy.cs b/NGitLab/Models/ContainerExpirationPolicy.cs new file mode 100644 index 000000000..56d2f7f7f --- /dev/null +++ b/NGitLab/Models/ContainerExpirationPolicy.cs @@ -0,0 +1,26 @@ +using System; +using System.Text.Json.Serialization; + +public class ContainerExpirationPolicy +{ + [JsonPropertyName("cadence")] + public string Cadence { get; set; } + + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } + + [JsonPropertyName("keep_n")] + public long KeepN { get; set; } + + [JsonPropertyName("older_than")] + public string OlderThan { get; set; } + + [JsonPropertyName("name_regex")] + public string NameRegex { get; set; } + + [JsonPropertyName("name_regex_keep")] + public string NameRegexKeep { get; set; } + + [JsonPropertyName("next_run_at")] + public DateTime? NextRunAt { get; set; } +} \ No newline at end of file diff --git a/NGitLab/Models/Project.cs b/NGitLab/Models/Project.cs index 86bf3d638..7083b6903 100644 --- a/NGitLab/Models/Project.cs +++ b/NGitLab/Models/Project.cs @@ -29,14 +29,14 @@ public class Project public bool JobEnabled { get; set; } [JsonPropertyName("builds_access_level")] - public string BuildsAccessLevel { get; set; } + public ProjectFeatureAccessLevel BuildsAccessLevel { get; set; } [JsonPropertyName("snippets_enabled")] [Obsolete("Deprecated by GitLab. Use SnippetsAccessLevel instead")] public bool SnippetsEnabled { get; set; } [JsonPropertyName("snippets_access_level")] - public string SnippetsAccessLevel { get; set; } + public ProjectFeatureAccessLevel SnippetsAccessLevel { get; set; } [JsonPropertyName("resolve_outdated_diff_discussions")] public bool ResolveOutdatedDiffDiscussions { get; set; } @@ -67,7 +67,7 @@ public class Project public bool IssuesEnabled { get; set; } [JsonPropertyName("issues_access_level")] - public string IssuesAccessLevel { get; set; } + public ProjectFeatureAccessLevel IssuesAccessLevel { get; set; } [JsonPropertyName("merge_pipelines_enabled")] public bool MergePipelinesEnabled { get; set; } @@ -77,7 +77,7 @@ public class Project public bool MergeRequestsEnabled { get; set; } [JsonPropertyName("merge_requests_access_level")] - public string MergeRequestsAccessLevel { get; set; } + public RepositoryAccessLevel MergeRequestsAccessLevel { get; set; } [JsonPropertyName("merge_trains_enabled")] public bool MergeTrainsEnabled { get; set; } @@ -96,7 +96,7 @@ public class Project public bool WikiEnabled { get; set; } [JsonPropertyName("wiki_access_level")] - public string WikiAccessLevel { get; set; } + public RepositoryAccessLevel WikiAccessLevel { get; set; } [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } @@ -220,11 +220,176 @@ public class Project public ProjectPermissions Permissions { get; set; } [JsonPropertyName("releases_access_level")] - public ReleasesAccessLevel ReleasesAccessLevel { get; set; } + public RepositoryAccessLevel ReleasesAccessLevel { get; set; } + + [JsonPropertyName("requirements_access_level")] + public RepositoryAccessLevel RequirementsAccessLevel { get; set; } [JsonPropertyName("mr_default_target_self")] public bool? MrDefaultTargetSelf { get; set; } [JsonPropertyName("ci_default_git_depth")] public int? CiDefaultGitDepth { get; set; } -} + + [JsonPropertyName("readme_url")] + public string ReadmeUrl { get; set; } + + [JsonPropertyName("container_registry_image_prefix")] + public string ContainerRegistryImagePrefix { get; set; } + + [JsonPropertyName("marked_for_deletion_at")] + public DateTime? MarkedForDeletionAt { get; set; } + + [JsonPropertyName("marked_for_deletion_on")] + public DateTime? MarkedForDeletionOn { get; set; } + + [JsonPropertyName("packages_enabled")] + public bool PackagesEnabled { get; set; } + + [JsonPropertyName("container_expiration_policy")] + public ContainerExpirationPolicy ContainerExpirationPolicy { get; set; } + + [JsonPropertyName("repository_object_format")] + public string RepositoryObjectFormat { get; set; } + + [JsonPropertyName("service_desk_enabled")] + public bool ServiceDeskEnabled { get; set; } + + [JsonPropertyName("service_desk_address")] + public string ServiceDeskAddress { get; set; } + + [JsonPropertyName("can_create_merge_request_in")] + public bool CanCreateMergeRequestIn { get; set; } + + [JsonPropertyName("pages_access_level")] + public RepositoryAccessLevel PagesAccessLevel { get; set; } + + [JsonPropertyName("analytics_access_level")] + public RepositoryAccessLevel AnalyticsAccessLevel { get; set; } + + [JsonPropertyName("container_registry_access_level")] + public RepositoryAccessLevel ContainerRegistryAccessLevel { get; set; } + + [JsonPropertyName("security_and_compliance_access_level")] + public RepositoryAccessLevel SecurityAndComplianceAccessLevel { get; set; } + + [JsonPropertyName("environments_access_level")] + public RepositoryAccessLevel EnvironmentsAccessLevel { get; set; } + + [JsonPropertyName("feature_flags_access_level")] + public RepositoryAccessLevel FeatureFlagsAccessLevel { get; set; } + + [JsonPropertyName("infrastructure_access_level")] + public RepositoryAccessLevel InfrastructureAccessLevel { get; set; } + + [JsonPropertyName("monitor_access_level")] + public RepositoryAccessLevel MonitorAccessLevel { get; set; } + + [JsonPropertyName("model_experiments_access_level")] + public RepositoryAccessLevel ModelExperimentsAccessLevel { get; set; } + + [JsonPropertyName("model_registry_access_level")] + public RepositoryAccessLevel ModelRegistryAccessLevel { get; set; } + + [JsonPropertyName("emails_disabled")] + public bool? EmailsDisabled { get; set; } + + [JsonPropertyName("emails_enabled")] + public bool? EmailsEnabled { get; set; } + + [JsonPropertyName("import_url")] + public string ImportUrl { get; set; } + + [JsonPropertyName("import_type")] + public string ImportType { get; set; } + + [JsonPropertyName("description_html")] + public string DescriptionHtml { get; set; } + + [JsonPropertyName("updated_at")] + public DateTime UpdatedAt { get; set; } + + [JsonPropertyName("ci_delete_pipelines_in_seconds")] + public long? CiDeletePipelinesInSeconds { get; set; } + + [JsonPropertyName("ci_forward_deployment_enabled")] + public bool CiForwardDeploymentEnabled { get; set; } + + [JsonPropertyName("ci_forward_deployment_rollback_allowed")] + public bool CiForwardDeploymentRollbackAllowed { get; set; } + + [JsonPropertyName("ci_job_token_scope_enabled")] + public bool CiJobTokenScopeEnabled { get; set; } + + [JsonPropertyName("ci_separated_caches")] + public bool CiSeparatedCaches { get; set; } + + [JsonPropertyName("ci_allow_fork_pipelines_to_run_in_parent_project")] + public bool CiAllowForkPipelinesToRunInParentProject { get; set; } + + [JsonPropertyName("ci_id_token_sub_claim_components")] + public string[] CiIdTokenSubClaimComponents { get; set; } + + [JsonPropertyName("build_git_strategy")] + public string BuildGitStrategy { get; set; } + + [JsonPropertyName("keep_latest_artifact")] + public bool KeepLatestArtifact { get; set; } + + [JsonPropertyName("restrict_user_defined_variables")] + public bool RestrictUserDefinedVariables { get; set; } + + [JsonPropertyName("ci_pipeline_variables_minimum_override_role")] + public string CiPipelineVariablesMinimumOverrideRole { get; set; } + + [JsonPropertyName("runner_token_expiration_interval")] + public long? RunnerTokenExpirationInterval { get; set; } + + [JsonPropertyName("auto_cancel_pending_pipelines")] + public string AutoCancelPendingPipelines { get; set; } + + [JsonPropertyName("auto_devops_enabled")] + public bool AutoDevopsEnabled { get; set; } + + [JsonPropertyName("auto_devops_deploy_strategy")] + public string AutoDevopsDeployStrategy { get; set; } + + [JsonPropertyName("ci_push_repository_for_job_token_allowed")] + public bool CiPushRepositoryForJobTokenAllowed { get; set; } + + [JsonPropertyName("ci_config_path")] + public string CiConfigPath { get; set; } + + [JsonPropertyName("allow_merge_on_skipped_pipeline")] + public bool? AllowMergeOnSkippedPipeline { get; set; } + + [JsonPropertyName("remove_source_branch_after_merge")] + public bool RemoveSourceBranchAfterMerge { get; set; } + + [JsonPropertyName("merge_request_title_regex")] + public string MergeRequestTitleRegex { get; set; } + + [JsonPropertyName("enforce_auth_checks_on_uploads")] + public bool EnforceAuthChecksOnUploads { get; set; } + + [JsonPropertyName("suggestion_commit_message")] + public string SuggestionCommitMessage { get; set; } + + [JsonPropertyName("merge_commit_template")] + public string MergeCommitTemplate { get; set; } + + [JsonPropertyName("squash_commit_template")] + public string SquashCommitTemplate { get; set; } + + [JsonPropertyName("issue_branch_template")] + public string IssueBranchTemplate { get; set; } + + [JsonPropertyName("warn_about_potentially_unwanted_characters")] + public bool WarnAboutPotentiallyUnwantedCharacters { get; set; } + + [JsonPropertyName("autoclose_referenced_issues")] + public bool AutocloseReferencedIssues { get; set; } + + [JsonPropertyName("max_artifacts_size")] + public long? MaxArtifactsSize { get; set; } +} \ No newline at end of file diff --git a/NGitLab/Models/RepositoryAccessLevel.cs b/NGitLab/Models/RepositoryAccessLevel.cs index 90819aec6..9485ee8ab 100644 --- a/NGitLab/Models/RepositoryAccessLevel.cs +++ b/NGitLab/Models/RepositoryAccessLevel.cs @@ -4,5 +4,6 @@ public enum RepositoryAccessLevel { Disabled, Private, - Enabled, + Enabled, + Public // Only valid for pages_access_level } From 6d64d348a6295d5f5f94ce61df203ef34ea4fa7c Mon Sep 17 00:00:00 2001 From: theknut Date: Mon, 28 Jul 2025 11:12:39 +0200 Subject: [PATCH 2/2] fix: remove usage of ProjectFeatureAccessLevel --- NGitLab/Models/Project.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/NGitLab/Models/Project.cs b/NGitLab/Models/Project.cs index 7083b6903..5e327f8b4 100644 --- a/NGitLab/Models/Project.cs +++ b/NGitLab/Models/Project.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Text.Json.Serialization; @@ -29,14 +29,14 @@ public class Project public bool JobEnabled { get; set; } [JsonPropertyName("builds_access_level")] - public ProjectFeatureAccessLevel BuildsAccessLevel { get; set; } + public RepositoryAccessLevel BuildsAccessLevel { get; set; } [JsonPropertyName("snippets_enabled")] [Obsolete("Deprecated by GitLab. Use SnippetsAccessLevel instead")] public bool SnippetsEnabled { get; set; } [JsonPropertyName("snippets_access_level")] - public ProjectFeatureAccessLevel SnippetsAccessLevel { get; set; } + public RepositoryAccessLevel SnippetsAccessLevel { get; set; } [JsonPropertyName("resolve_outdated_diff_discussions")] public bool ResolveOutdatedDiffDiscussions { get; set; } @@ -67,7 +67,7 @@ public class Project public bool IssuesEnabled { get; set; } [JsonPropertyName("issues_access_level")] - public ProjectFeatureAccessLevel IssuesAccessLevel { get; set; } + public RepositoryAccessLevel IssuesAccessLevel { get; set; } [JsonPropertyName("merge_pipelines_enabled")] public bool MergePipelinesEnabled { get; set; } @@ -392,4 +392,4 @@ public class Project [JsonPropertyName("max_artifacts_size")] public long? MaxArtifactsSize { get; set; } -} \ No newline at end of file +}