using ModpackUpdater.Apps.Manager.Api.Model; using NGitLab; using NGitLab.Models; namespace ModpackUpdater.Apps.Manager.Features.Workspaces.GitLabRepo; internal class GitLabRepoWorkspace(GitLabRepoWorkspaceConfig config) : IWorkspace { private string? rawInstallInfos = null; private string? rawUpdateInfos = null; public WorkspaceConfig Config => ConfigX; public GitLabRepoWorkspaceConfig ConfigX { get; } = config; public IGitLabClient Gitlab { get; } = new GitLabClient(config.InstanceUrl, config.ApiToken); public ModpackConfig? ModpackConfig { get; private set; } public InstallInfos? InstallInfos { get; private set; } public UpdateInfos? UpdateInfos { get; private set; } public async Task Load() { if (!string.IsNullOrWhiteSpace(Config.ModpackConfigUrl)) ModpackConfig = ModpackConfig.LoadFromUrl(Config.ModpackConfigUrl); rawInstallInfos = await GetContent(ConfigX.FileLocationInstallJson); InstallInfos = InstallInfos.Parse(rawInstallInfos); rawUpdateInfos = await GetContent(ConfigX.FileLocationUpdateJson); UpdateInfos = UpdateInfos.Parse(rawUpdateInfos); ConfigX.RepoName = (await Gitlab.Projects.GetByIdAsync((int)ConfigX.RepoId, new())).Name; return InstallInfos != null && UpdateInfos != null; } public async Task Save() { if (InstallInfos != null) { var newInstallInfos = InstallInfos.ToString(); if (newInstallInfos != rawInstallInfos) { await SaveContent(ConfigX.FileLocationInstallJson, newInstallInfos); rawInstallInfos = newInstallInfos; } } if (UpdateInfos != null) { var newUpdateInfos = UpdateInfos.ToString(); if (newUpdateInfos != rawUpdateInfos) { await SaveContent(ConfigX.FileLocationUpdateJson, newUpdateInfos); rawUpdateInfos = newUpdateInfos; } } return true; } private async Task GetContent(string path) { var repoId = new ProjectId(ConfigX.RepoId); var repo = Gitlab.GetRepository(repoId); var data = await repo.Files.GetAsync(path, ConfigX.RepoBranche); return data.DecodedContent; } private Task SaveContent(string path, string content) { var repoId = new ProjectId(ConfigX.RepoId); var repo = Gitlab.GetRepository(repoId); var update = new FileUpsert { Branch = ConfigX.RepoBranche, CommitMessage = "update " + Path.GetFileName(path), RawContent = content, Path = path, }; if (repo.Files.FileExists(path, ConfigX.RepoBranche)) repo.Files.Update(update); else repo.Files.Create(update); return Task.FromResult(true); } }