tgstation-server 6.1.2
The /tg/station 13 server suite
Loading...
Searching...
No Matches
UserGroupController.cs
Go to the documentation of this file.
1using System;
2using System.Linq;
3using System.Threading;
4using System.Threading.Tasks;
5
6using Microsoft.AspNetCore.Mvc;
7using Microsoft.EntityFrameworkCore;
8using Microsoft.Extensions.Logging;
9using Microsoft.Extensions.Options;
10
23
24using Z.EntityFramework.Plus;
25
27{
31 [Route(Routes.UserGroup)]
33 {
38
48 IDatabaseContext databaseContext,
49 IAuthenticationContext authenticationContext,
50 IOptions<GeneralConfiguration> generalConfigurationOptions,
51 ILogger<UserGroupController> logger,
52 IApiHeadersProvider apiHeaders)
53 : base(
54 databaseContext,
55 authenticationContext,
56 apiHeaders,
57 logger,
58 true)
59 {
60 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
61 }
62
70 [HttpPut]
71 [TgsAuthorize(AdministrationRights.WriteUsers)]
72 [ProducesResponseType(typeof(UserGroupResponse), 201)]
73 public async ValueTask<IActionResult> Create([FromBody] UserGroupCreateRequest model, CancellationToken cancellationToken)
74 {
75 ArgumentNullException.ThrowIfNull(model);
76
77 if (model.Name == null)
78 return BadRequest(new ErrorMessageResponse(ErrorCode.ModelValidationFailure));
79
80 var totalGroups = await DatabaseContext
81 .Groups
82 .AsQueryable()
83 .CountAsync(cancellationToken);
84 if (totalGroups >= generalConfiguration.UserGroupLimit)
85 return Conflict(new ErrorMessageResponse(ErrorCode.UserGroupLimitReached));
86
87 var permissionSet = new Models.PermissionSet
88 {
90 InstanceManagerRights = model.PermissionSet?.InstanceManagerRights ?? InstanceManagerRights.None,
91 };
92
93 var dbGroup = new UserGroup
94 {
95 Name = model.Name,
96 PermissionSet = permissionSet,
97 };
98
99 DatabaseContext.Groups.Add(dbGroup);
100 await DatabaseContext.Save(cancellationToken);
101 Logger.LogInformation("Created new user group {groupName} ({groupId})", dbGroup.Name, dbGroup.Id);
102
103 return Created(dbGroup.ToApi(true));
104 }
105
114 [HttpPost]
115 [TgsAuthorize(AdministrationRights.WriteUsers)]
116 [ProducesResponseType(typeof(UserGroupResponse), 200)]
117 public async ValueTask<IActionResult> Update([FromBody] UserGroupUpdateRequest model, CancellationToken cancellationToken)
118 {
119 ArgumentNullException.ThrowIfNull(model);
120
121 var currentGroup = await DatabaseContext
122 .Groups
123 .AsQueryable()
124 .Where(x => x.Id == model.Id)
125 .Include(x => x.PermissionSet)
126 .Include(x => x.Users)
127 .FirstOrDefaultAsync(cancellationToken);
128
129 if (currentGroup == default)
130 return this.Gone();
131
132 if (model.PermissionSet != null)
133 {
134 currentGroup.PermissionSet!.AdministrationRights = model.PermissionSet.AdministrationRights ?? currentGroup.PermissionSet.AdministrationRights;
135 currentGroup.PermissionSet.InstanceManagerRights = model.PermissionSet.InstanceManagerRights ?? currentGroup.PermissionSet.InstanceManagerRights;
136 }
137
138 currentGroup.Name = model.Name ?? currentGroup.Name;
139
140 await DatabaseContext.Save(cancellationToken);
141
143 return Json(new UserGroupResponse
144 {
145 Id = currentGroup.Id,
146 });
147
148 return Json(currentGroup.ToApi(true));
149 }
150
159 [HttpGet("{id}")]
160 [TgsAuthorize(AdministrationRights.ReadUsers)]
161 [ProducesResponseType(typeof(UserGroupResponse), 200)]
162 [ProducesResponseType(typeof(ErrorMessageResponse), 410)]
163 public async ValueTask<IActionResult> GetId(long id, CancellationToken cancellationToken)
164 {
165 // this functions as userId
166 var group = await DatabaseContext
167 .Groups
168 .AsQueryable()
169 .Where(x => x.Id == id)
170 .Include(x => x.Users)
171 .Include(x => x.PermissionSet)
172 .FirstOrDefaultAsync(cancellationToken);
173 if (group == default)
174 return this.Gone();
175 return Json(group.ToApi(true));
176 }
177
186 [HttpGet(Routes.List)]
187 [TgsAuthorize(AdministrationRights.ReadUsers)]
188 [ProducesResponseType(typeof(PaginatedResponse<UserGroupResponse>), 200)]
189 public ValueTask<IActionResult> List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
190 => Paginated<UserGroup, UserGroupResponse>(
191 () => ValueTask.FromResult(
194 .Groups
195 .AsQueryable()
196 .Include(x => x.Users)
197 .Include(x => x.PermissionSet)
198 .OrderBy(x => x.Id))),
199 null,
200 page,
201 pageSize,
202 cancellationToken);
203
213 [HttpDelete("{id}")]
214 [TgsAuthorize(AdministrationRights.WriteUsers)]
215 [ProducesResponseType(204)]
216 [ProducesResponseType(typeof(ErrorMessageResponse), 409)]
217 [ProducesResponseType(typeof(ErrorMessageResponse), 410)]
218 public async ValueTask<IActionResult> Delete(long id, CancellationToken cancellationToken)
219 {
220 var numDeleted = await DatabaseContext
221 .Groups
222 .AsQueryable()
223 .Where(x => x.Id == id && x.Users!.Count == 0)
224 .DeleteAsync(cancellationToken);
225
226 if (numDeleted > 0)
227 return NoContent();
228
229 // find out how we failed
230 var groupExists = await DatabaseContext
231 .Groups
232 .AsQueryable()
233 .Where(x => x.Id == id)
234 .AnyAsync(cancellationToken);
235
236 return groupExists
237 ? Conflict(new ErrorMessageResponse(ErrorCode.UserGroupNotEmpty))
238 : this.Gone();
239 }
240 }
241}
uint UserGroupLimit
The maximum number of user groups allowed.
virtual ? string Name
The name of the entity represented by the NamedEntity.
Definition: NamedEntity.cs:16
Represents a set of server permissions.
AdministrationRights? AdministrationRights
The Rights.AdministrationRights for the user.
Represents an error message returned by the server.
Routes to a server actions.
Definition: Routes.cs:9
const string UserGroup
The user group controller.
Definition: Routes.cs:38
const string List
The postfix for list operations.
Definition: Routes.cs:108
Base Controller for API functions.
ObjectResult Created(object payload)
Generic 201 response with a given payload .
ILogger< ApiController > Logger
The ILogger for the ApiController.
ApiController for managing UserGroupResponses.
async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Gets a specific UserGroup.
UserGroupController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< UserGroupController > logger, IApiHeadersProvider apiHeaders)
Initializes a new instance of the UserGroupController class.
async ValueTask< IActionResult > Create([FromBody] UserGroupCreateRequest model, CancellationToken cancellationToken)
Create a new UserGroup.
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserGroupController.
async ValueTask< IActionResult > Update([FromBody] UserGroupUpdateRequest model, CancellationToken cancellationToken)
Update a UserGroup.
ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
Lists all UserGroups.
async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete a UserGroup.
Backend abstract implementation of IDatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
DbSet< UserGroup > Groups
The UserGroups in the DatabaseContext.
Represents a group of Users.
Definition: UserGroup.cs:15
PermissionSet PermissionSet
The User's effective PermissionSet.
Represents the currently authenticated Models.User.
ErrorCode
Types of Response.ErrorMessageResponses that the API may return.
Definition: ErrorCode.cs:13
InstanceManagerRights
Rights for managing Models.Instances.
AdministrationRights
Administration rights for the server.