fix: Can not delete repository.
This commit is contained in:
parent
ab1ee9925d
commit
4854c5b89e
@ -44,7 +44,6 @@ public class RepositoryService : BaseService<RepositoryService>
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool SaveRepositoryLocalDatabaseChanges(RepositoryModel repo)
|
public bool SaveRepositoryLocalDatabaseChanges(RepositoryModel repo)
|
||||||
{
|
{
|
||||||
var localRepo = GetRepositoryLocalDatabase(repo);
|
var localRepo = GetRepositoryLocalDatabase(repo);
|
||||||
@ -188,6 +187,29 @@ public class RepositoryService : BaseService<RepositoryService>
|
|||||||
return true;
|
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)
|
public async ValueTask<bool> DeleteMemberFromServerAsync(RepositoryModel repo, RepositoryModel.Member member)
|
||||||
{
|
{
|
||||||
var api = Api.C;
|
var api = Api.C;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
@ -306,6 +307,7 @@ public partial class RepositoryViewModel : RoutableViewModelBase
|
|||||||
if (role >= RepositoryModel.RepositoryRole.Guest) IsGuestRole = true;
|
if (role >= RepositoryModel.RepositoryRole.Guest) IsGuestRole = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[ReactiveCommand]
|
[ReactiveCommand]
|
||||||
private async Task CommitSelectedChangesAsync()
|
private async Task CommitSelectedChangesAsync()
|
||||||
{
|
{
|
||||||
@ -334,6 +336,23 @@ public partial class RepositoryViewModel : RoutableViewModelBase
|
|||||||
await RendererFileTreeAsync();
|
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]
|
[ReactiveCommand]
|
||||||
private async Task PullLatestRepositoryAsync()
|
private async Task PullLatestRepositoryAsync()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
x:Class="Flawless.Client.Views.RepositoryPage.RepoSettingPageView">
|
x:Class="Flawless.Client.Views.RepositoryPage.RepoSettingPageView">
|
||||||
<TabControl TabStripPlacement="Left">
|
<TabControl TabStripPlacement="Left">
|
||||||
<TabItem Header="Members">
|
<TabItem Header="Members">
|
||||||
<StackPanel Width="600" Orientation="Vertical" HorizontalAlignment="Stretch">
|
<StackPanel Width="600" Orientation="Vertical" HorizontalAlignment="Left">
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Spacing="8">
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Spacing="8">
|
||||||
<u:IconButton Icon="{StaticResource SemiIconPlus}" Content="Add User"
|
<u:IconButton Icon="{StaticResource SemiIconPlus}" Content="Add User"
|
||||||
IsVisible="{Binding Repository.OwnByCurrentUser}"
|
IsVisible="{Binding Repository.OwnByCurrentUser}"
|
||||||
@ -42,12 +42,17 @@
|
|||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Statics" IsVisible="{Binding IsDeveloperRole}">
|
|
||||||
<StackPanel Width="600" HorizontalAlignment="Stretch">
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
</TabItem>
|
|
||||||
<TabItem Header="Admin Area" IsVisible="{Binding IsOwnerRole}">
|
<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 Width="600" HorizontalAlignment="Stretch">
|
||||||
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@ -17,6 +17,8 @@
|
|||||||
Command="{Binding DeselectAllChangesCommand}"/>
|
Command="{Binding DeselectAllChangesCommand}"/>
|
||||||
<u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Pull"
|
<u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Pull"
|
||||||
Command="{Binding PullLatestRepositoryCommand}"/>
|
Command="{Binding PullLatestRepositoryCommand}"/>
|
||||||
|
<!-- <u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Open Folder" -->
|
||||||
|
<!-- Command="{Binding OpenFolderInSystemDefaultExplorerCommand}"/> -->
|
||||||
<!-- <ToggleButton Content="Auto Refresh" IsChecked="{Binding AutoDetectChanges}"/> -->
|
<!-- <ToggleButton Content="Auto Refresh" IsChecked="{Binding AutoDetectChanges}"/> -->
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TreeDataGrid Grid.Row="1" Grid.Column="0" Source="{Binding LocalChange}" CanUserSortColumns="True"/>
|
<TreeDataGrid Grid.Row="1" Grid.Column="0" Source="{Binding LocalChange}" CanUserSortColumns="True"/>
|
||||||
|
|||||||
@ -29,35 +29,49 @@ public class RepositoryInnieController(
|
|||||||
#region Unresoted
|
#region Unresoted
|
||||||
|
|
||||||
[HttpPost("delete_repo")]
|
[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 u = (await userManager.GetUserAsync(HttpContext.User))!;
|
||||||
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
|
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
|
||||||
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dbContext.Repositories.Remove(rp);
|
|
||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("get_info")]
|
[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 u = (await userManager.GetUserAsync(HttpContext.User))!;
|
||||||
var rp = await dbContext.Repositories
|
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
|
||||||
.Include(repository => repository.Owner)
|
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
|
||||||
.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!"));
|
|
||||||
|
|
||||||
return Ok(new RepositoryInfoResponse
|
return Ok(new RepositoryInfoResponse
|
||||||
{
|
{
|
||||||
@ -70,14 +84,12 @@ public class RepositoryInnieController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("archive_repo")]
|
[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 u = (await userManager.GetUserAsync(HttpContext.User))!;
|
||||||
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
|
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
|
||||||
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
|
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
|
||||||
|
|
||||||
if (rp.IsArchived) return BadRequest(new FailedResponse("Repository is archived!"));
|
if (rp.IsArchived) return BadRequest(new FailedResponse("Repository is archived!"));
|
||||||
|
|
||||||
rp.IsArchived = true;
|
rp.IsArchived = true;
|
||||||
@ -87,14 +99,12 @@ public class RepositoryInnieController(
|
|||||||
|
|
||||||
|
|
||||||
[HttpPost("unarchive_repo")]
|
[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 u = (await userManager.GetUserAsync(HttpContext.User))!;
|
||||||
var rp = await dbContext.Repositories.FirstOrDefaultAsync(rp => rp.Name == repositoryName && u == rp.Owner);
|
var grantIssue = await ValidateRepositoryAsync(userName, repositoryName, u, RepositoryRole.Guest);
|
||||||
if (rp == null) return BadRequest(new FailedResponse("Repository not found!"));
|
if (grantIssue is not Repository rp) return (ActionResult) grantIssue;
|
||||||
|
|
||||||
if (!rp.IsArchived) return BadRequest(new FailedResponse("Repository is not archived!"));
|
if (!rp.IsArchived) return BadRequest(new FailedResponse("Repository is not archived!"));
|
||||||
|
|
||||||
rp.IsArchived = false;
|
rp.IsArchived = false;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user