fix: Can not delete repository.
This commit is contained in:
parent
ab1ee9925d
commit
4854c5b89e
@ -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;
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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"/>
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user