1
0

fix: Can not delete repository.

This commit is contained in:
Ca2didi 2025-04-02 13:00:02 +08:00
parent ab1ee9925d
commit 4854c5b89e
5 changed files with 98 additions and 40 deletions

View File

@ -43,8 +43,7 @@ public class RepositoryService : BaseService<RepositoryService>
return true;
}
public bool SaveRepositoryLocalDatabaseChanges(RepositoryModel repo)
{
var localRepo = GetRepositoryLocalDatabase(repo);
@ -188,6 +187,29 @@ public class RepositoryService : BaseService<RepositoryService>
return true;
}
public async ValueTask<bool> DeleteRepositoryOnServerAsync(RepositoryModel repo)
{
var api = Api.C;
try
{
if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync()))
{
api.ClearGateway();
return false;
}
await api.Gateway.DeleteRepo(repo.Name, repo.OwnerName);
return true;
}
catch (Exception e)
{
UIHelper.NotifyError(e);
Console.WriteLine(e);
return false;
}
}
public async ValueTask<bool> DeleteMemberFromServerAsync(RepositoryModel repo, RepositoryModel.Member member)
{
var api = Api.C;

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reactive.Linq;
@ -305,6 +306,7 @@ public partial class RepositoryViewModel : RoutableViewModelBase
if (role >= RepositoryModel.RepositoryRole.Reporter) IsReporterRole = true;
if (role >= RepositoryModel.RepositoryRole.Guest) IsGuestRole = true;
}
[ReactiveCommand]
private async Task CommitSelectedChangesAsync()
@ -334,6 +336,23 @@ public partial class RepositoryViewModel : RoutableViewModelBase
await RendererFileTreeAsync();
}
[ReactiveCommand]
private async Task DeleteRepositoryBothServerAndLocalAsync()
{
var msg = "THIS IS AN UNREVERT ACTION, YOU SHOULD AWARE THAT THIS MAY CAUSE DATA LOSS. DO YOU CONTINUE DELETE THIS REPOSITORY?";
var confirm = await UIHelper.SimpleAskAsync(msg, DialogMode.Error) == DialogResult.Yes;
if (confirm)
{
using var l = UIHelper.MakeLoading("Delete repository...");
if (!await RepositoryService.C.DeleteRepositoryOnServerAsync(Repository)) return;
await HostScreen.Router.NavigateBack.Execute();
await RepositoryService.C.CloseRepositoryAsync(Repository);
await RepositoryService.C.DeleteFromDiskAsync(Repository);
await RepositoryService.C.UpdateRepositoriesFromServerAsync();
await RepositoryService.C.UpdateRepositoriesDownloadedStatusFromDiskAsync();
}
}
[ReactiveCommand]
private async Task PullLatestRepositoryAsync()
{

View File

@ -9,7 +9,7 @@
x:Class="Flawless.Client.Views.RepositoryPage.RepoSettingPageView">
<TabControl TabStripPlacement="Left">
<TabItem Header="Members">
<StackPanel Width="600" Orientation="Vertical" HorizontalAlignment="Stretch">
<StackPanel Width="600" Orientation="Vertical" HorizontalAlignment="Left">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Spacing="8">
<u:IconButton Icon="{StaticResource SemiIconPlus}" Content="Add User"
IsVisible="{Binding Repository.OwnByCurrentUser}"
@ -42,12 +42,17 @@
</ScrollViewer>
</StackPanel>
</TabItem>
<TabItem Header="Statics" IsVisible="{Binding IsDeveloperRole}">
<StackPanel Width="600" HorizontalAlignment="Stretch">
</StackPanel>
</TabItem>
<TabItem Header="Admin Area" IsVisible="{Binding IsOwnerRole}">
<ScrollViewer Width="400" HorizontalAlignment="Left">
<u:Form HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<u:FormItem Label="Delete Repository">
<Button HorizontalAlignment="Stretch" Classes="Danger" Content="Yes I Want to Delete this Repository"
Command="{Binding DeleteRepositoryBothServerAndLocalCommand}"/>
</u:FormItem>
</u:Form>
</ScrollViewer>
</TabItem>
<TabItem Header="Statics" IsVisible="{Binding IsDeveloperRole}">
<StackPanel Width="600" HorizontalAlignment="Stretch">
</StackPanel>

View File

@ -17,6 +17,8 @@
Command="{Binding DeselectAllChangesCommand}"/>
<u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Pull"
Command="{Binding PullLatestRepositoryCommand}"/>
<!-- <u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Open Folder" -->
<!-- Command="{Binding OpenFolderInSystemDefaultExplorerCommand}"/> -->
<!-- <ToggleButton Content="Auto Refresh" IsChecked="{Binding AutoDetectChanges}"/> -->
</StackPanel>
<TreeDataGrid Grid.Row="1" Grid.Column="0" Source="{Binding LocalChange}" CanUserSortColumns="True"/>

View File

@ -29,35 +29,49 @@ public class RepositoryInnieController(
#region Unresoted
[HttpPost("delete_repo")]
public async Task<IActionResult> DeleteRepositoryAsync(string repositoryName)
public async Task<IActionResult> DeleteRepositoryAsync(string userName, string repositoryName)
{
if (string.IsNullOrWhiteSpace(repositoryName) || repositoryName.Length <= 3)
return BadRequest(new FailedResponse("Repository name is empty or too short!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
dbContext.Repositories.Remove(rp);
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
if (grantIssue is not Repository) return (ActionResult) grantIssue;
await using (var t = await dbContext.Database.BeginTransactionAsync())
{
var set = await dbContext.Repositories
.Include(x => x.Commits)
.Include(x => x.Depots)
.Include(x => x.Members)
.Include(x => x.Locked)
.FirstAsync(x => x.Name == repositoryName && x.Owner.UserName == userName);
try
{
set.Commits.Clear();
set.Depots.Clear();
set.Members.Clear();
set.Locked.Clear();
set.Owner = null!;
dbContext.Remove(set);
await t.CommitAsync();
}
catch (Exception)
{
await t.RollbackAsync();
throw;
}
}
await dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet("get_info")]
public async Task<ActionResult<RepositoryInfoResponse>> IsRepositoryArchiveAsync(string repositoryName)
public async Task<ActionResult<RepositoryInfoResponse>> IsRepositoryArchiveAsync(string userName, string repositoryName)
{
if (string.IsNullOrWhiteSpace(repositoryName) || repositoryName.Length <= 3)
return BadRequest(new FailedResponse("Repository name is empty or too short!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var rp = await dbContext.Repositories
.Include(repository => repository.Owner)
.Include(repository => repository.Commits)
.Include(repository => repository.Members)
.ThenInclude(repositoryMember => repositoryMember.User)
.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
return Ok(new RepositoryInfoResponse
{
@ -70,14 +84,12 @@ public class RepositoryInnieController(
}
[HttpPost("archive_repo")]
public async Task<IActionResult> ArchiveRepositoryAsync(string repositoryName)
public async Task<IActionResult> ArchiveRepositoryAsync(string userName, string repositoryName)
{
if (string.IsNullOrWhiteSpace(repositoryName) || repositoryName.Length <= 3)
return BadRequest(new FailedResponse("Repository name is empty or too short!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
if (rp.IsArchived) return BadRequest(new FailedResponse("Repository is archived!"));
rp.IsArchived = true;
@ -87,14 +99,12 @@ public class RepositoryInnieController(
[HttpPost("unarchive_repo")]
public async Task<IActionResult> UnarchiveRepositoryAsync(string repositoryName)
public async Task<IActionResult> UnarchiveRepositoryAsync(string userName, string repositoryName)
{
if (string.IsNullOrWhiteSpace(repositoryName) || repositoryName.Length <= 3)
return BadRequest(new FailedResponse("Repository name is empty or too short!"));
var u = (await userManager.GetUserAsync(HttpContext.User))!;
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
if (!rp.IsArchived) return BadRequest(new FailedResponse("Repository is not archived!"));
rp.IsArchived = false;