-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathDeleteEntityController.cs
105 lines (94 loc) · 4.25 KB
/
DeleteEntityController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using Cloudy.NET.ContextSupport;
using Cloudy.NET.EntitySupport.PrimaryKey;
using Cloudy.NET.EntityTypeSupport;
using Cloudy.NET.EntityTypeSupport.Naming;
using Cloudy.NET.Naming;
using Cloudy.NET.UI.Layout;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Cloudy.NET.UI.FormSupport
{
[Authorize("adminarea")]
[Area("Admin")]
[ResponseCache(NoStore = true)]
public class DeleteEntityController : Controller
{
IEntityTypeNameProvider EntityTypeNameProvider { get; }
IEntityTypeProvider EntityTypeProvider { get; }
IPrimaryKeyConverter PrimaryKeyConverter { get; }
IContextCreator ContextCreator { get; }
INameGetter NameGetter { get; }
IPrimaryKeyPropertyGetter PrimaryKeyPropertyGetter { get; }
public DeleteEntityController(
IEntityTypeProvider entityTypeProvider,
IPrimaryKeyConverter primaryKeyConverter,
IContextCreator contextCreator,
IPrimaryKeyPropertyGetter primaryKeyPropertyGetter,
IEntityTypeNameProvider entityTypeNameProvider,
INameGetter nameGetter)
{
EntityTypeProvider = entityTypeProvider;
PrimaryKeyConverter = primaryKeyConverter;
ContextCreator = contextCreator;
PrimaryKeyPropertyGetter = primaryKeyPropertyGetter;
EntityTypeNameProvider = entityTypeNameProvider;
NameGetter = nameGetter;
}
[HttpGet]
[Route("/{area}/api/form/entity/delete")]
public async Task<DeleteEntityViewModel> Get([FromQuery] string entityTypeName, [FromQuery] string[] keys)
{
var entityType = EntityTypeProvider.Get(entityTypeName);
var keyValues = PrimaryKeyConverter.Convert(keys, entityType.Type);
var context = ContextCreator.CreateFor(entityType.Type);
var instance = await context.Context.FindAsync(entityType.Type, keyValues).ConfigureAwait(false);
var primaryKeys = PrimaryKeyPropertyGetter.GetFor(entityType.Type);
var primaryKeysWithValues = primaryKeys
.Select(pk => new { pk.Name, Value = pk.GetValue(instance)?.ToString() })
.ToDictionary(item => item.Name, item => item.Value);
return new DeleteEntityViewModel
{
InstanceName = NameGetter.GetName(instance),
PluralLowerCaseName = EntityTypeNameProvider.Get(entityType.Type).PluralLowerCaseName,
PrimaryKeysWithValues = primaryKeysWithValues
};
}
[HttpDelete]
[Route("/{area}/api/form/entity/delete")]
public async Task<DeleteResponse> Delete([FromQuery] string entityTypeName, [FromQuery] string[] keys)
{
var entityType = EntityTypeProvider.Get(entityTypeName);
if (entityType.IsSingleton) return new DeleteResponse
{
RedirectUrl = UrlBuilder.Build(keys: null, "List", entityTypeName)
};
var keyValues = PrimaryKeyConverter.Convert(keys, entityType.Type);
var context = ContextCreator.CreateFor(entityType.Type);
var instance = await context.Context.FindAsync(entityType.Type, keyValues).ConfigureAwait(false);
if (instance is null) return new DeleteResponse
{
ErrorMessage = $"Could not find instance of type {entityTypeName} and key{(keys.Length > 1 ? "s" : null)} {string.Join(", ", keys)}"
};
context.Context.Remove(instance);
await context.Context.SaveChangesAsync().ConfigureAwait(false);
return new DeleteResponse
{
RedirectUrl = UrlBuilder.Build(keys: null, "List", entityTypeName)
};
}
public class DeleteEntityViewModel
{
public string InstanceName { get; set; }
public string PluralLowerCaseName { get; set; }
public Dictionary<string, string> PrimaryKeysWithValues { get; set; }
}
public class DeleteResponse
{
public string ErrorMessage { get; set; }
public string RedirectUrl { get; set; }
}
}
}