using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Threading.Tasks; using Flawless.Client.Models; using Flawless.Client.Remote; namespace Flawless.Client.Service; public class RepositoryService : BaseService { public ObservableCollection Repositories => _repositories; private readonly ObservableCollection _repositories = new(); public async ValueTask CreateRepositoryOnServerAsync(string repositoryName) { var api = Api.C; try { if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync())) { api.ClearGateway(); return false; } var r = await api.Gateway.RepoCreate(repositoryName); var repo = new RepositoryModel(); repo.Name = r.RepositoryName; repo.OwnerName = r.OwnerUsername; repo.StandaloneName = RepositoryModel.GetStandaloneName(r.RepositoryName, r.OwnerUsername); repo.Description = r.Description; repo.Archived = r.IsArchived; repo.OwnByCurrentUser = (int) r.Role == (int) RepositoryModel.RepositoryRole.Owner; Repositories.Insert(0, repo); } catch (Exception e) { Console.WriteLine(e); return false; } return true; } public async ValueTask UpdateRepositoriesFromServerAsync() { var api = Api.C; try { if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync())) { api.ClearGateway(); return false; } var result = (await api.Gateway.RepoList()).Result; var dict = result.ToDictionary(rp => RepositoryModel.GetStandaloneName(rp.RepositoryName, rp.OwnerUsername)); for (var i = 0; i < Repositories.Count; i++) { var ele = Repositories[i]; if (!dict.Remove(ele.StandaloneName, out var role)) { Repositories.RemoveAt(i); i -= 1; continue; } ele.Archived = ele.Archived; ele.Description = ele.Description; } foreach (var (repoStandaloneName, rsp) in dict) { var repo = new RepositoryModel(); repo.Name = rsp.RepositoryName; repo.OwnerName = rsp.OwnerUsername; repo.StandaloneName = repoStandaloneName; repo.Description = rsp.Description; repo.Archived = rsp.IsArchived; repo.OwnByCurrentUser = (int) rsp.Role == (int) RepositoryModel.RepositoryRole.Owner; Repositories.Add(repo); } } catch (Exception e) { Console.WriteLine(e); return false; } return true; } public async ValueTask UpdateRepositoriesDownloadedFromDiskAsync() { foreach (var repo in _repositories) { var fsPath = Path.Combine(SettingService.C.AppSetting.RepositoryPath, repo.OwnerName, repo.Name); repo.IsDownloaded = Directory.Exists(fsPath); } return true; } public async ValueTask UpdateRepositoryMembersFromServerAsync(RepositoryModel repo) { var api = Api.C; try { if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync())) { api.ClearGateway(); return false; } var members = await api.Gateway.GetUsers(repo.Name, repo.OwnerName); // Update existed var dict = members.Result.ToDictionary(m => m.Username); for (var i = 0; i < repo.Members.Count; i++) { var ele = repo.Members[i]; if (!dict.Remove(ele.Username, out var role)) { repo.Members.RemoveAt(i); i -= 1; continue; } ele.Username = role.Username; ele.Role = (RepositoryModel.RepositoryRole) role.Role; } // Add missing foreach (var role in dict.Values) { var r = new RepositoryModel.Member { Username = role.Username, Role = (RepositoryModel.RepositoryRole) role.Role }; repo.Members.Add(r); } } catch (Exception e) { Console.WriteLine(e); return false; } return true; } }