diff --git a/API/Controller/Admin/GetOnlineDevices.cs b/API/Controller/Admin/GetOnlineDevices.cs index bac5b076..7fe4afaa 100644 --- a/API/Controller/Admin/GetOnlineDevices.cs +++ b/API/Controller/Admin/GetOnlineDevices.cs @@ -25,7 +25,7 @@ public async Task GetOnlineDevices() { var devicesOnline = _redis.RedisCollection(false); - var allOnlineDevices = await devicesOnline.ToListAsync(); + var allOnlineDevices = await devicesOnline.ToArrayAsync(); var dbLookup = await _db.Devices.Where(x => allOnlineDevices.Select(y => y.Id) .Contains(x.Id)).Select( x => @@ -39,7 +39,7 @@ public async Task GetOnlineDevices() Image = x.OwnerNavigation.GetImageUrl(), Name = x.OwnerNavigation.Name } - }).ToListAsync(); + }).ToArrayAsync(); return RespondSuccessLegacy(allOnlineDevices.Select(x => { diff --git a/API/Controller/Admin/GetUsers.cs b/API/Controller/Admin/GetUsers.cs index 91d2fd42..d655261a 100644 --- a/API/Controller/Admin/GetUsers.cs +++ b/API/Controller/Admin/GetUsers.cs @@ -61,7 +61,7 @@ public async Task GetUsers( return Ok(new Paginated { - Data = await deferredUsers.ToListAsync(), + Data = await deferredUsers.ToArrayAsync(), Offset = offset, Limit = limit, Total = await deferredCount.ValueAsync(), diff --git a/API/Controller/Devices/DevicesController.cs b/API/Controller/Devices/DevicesController.cs index ba39e629..0eaf5e3b 100644 --- a/API/Controller/Devices/DevicesController.cs +++ b/API/Controller/Devices/DevicesController.cs @@ -23,7 +23,7 @@ public sealed partial class DevicesController /// /// All devices for the current user [HttpGet] - [ProducesResponseType>>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [MapToApiVersion("1")] public async Task ListDevices() { @@ -33,7 +33,7 @@ public async Task ListDevices() Id = x.Id, Name = x.Name, CreatedOn = x.CreatedOn - }).ToListAsync(); + }).ToArrayAsync(); return RespondSuccessLegacy(devices); } diff --git a/API/Controller/Devices/ShockersController.cs b/API/Controller/Devices/ShockersController.cs index 819e8d38..0f962f82 100644 --- a/API/Controller/Devices/ShockersController.cs +++ b/API/Controller/Devices/ShockersController.cs @@ -19,13 +19,14 @@ public sealed partial class DevicesController /// All shockers for the device /// Device does not exists or you do not have access to it. [HttpGet("{deviceId}/shockers")] - [ProducesResponseType>>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [ProducesResponseType(StatusCodes.Status404NotFound, MediaTypeNames.Application.ProblemJson)] // DeviceNotFound [MapToApiVersion("1")] public async Task GetShockers([FromRoute] Guid deviceId) { var deviceExists = await _db.Devices.AnyAsync(x => x.Owner == CurrentUser.Id && x.Id == deviceId); if (!deviceExists) return Problem(DeviceError.DeviceNotFound); + var shockers = await _db.Shockers.Where(x => x.Device == deviceId).Select(x => new ShockerResponse { Id = x.Id, @@ -34,7 +35,7 @@ public async Task GetShockers([FromRoute] Guid deviceId) CreatedOn = x.CreatedOn, Model = x.Model, IsPaused = x.Paused - }).ToListAsync(); + }).ToArrayAsync(); return RespondSuccessLegacy(shockers); } diff --git a/API/Controller/Shares/Links/ListShareLinks.cs b/API/Controller/Shares/Links/ListShareLinks.cs index 2986ad48..63d57538 100644 --- a/API/Controller/Shares/Links/ListShareLinks.cs +++ b/API/Controller/Shares/Links/ListShareLinks.cs @@ -14,11 +14,11 @@ public sealed partial class ShareLinksController /// /// All share links for the current user [HttpGet] - [ProducesResponseType>>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] public async Task List() { var ownShareLinks = await _db.ShockerSharesLinks.Where(x => x.OwnerId == CurrentUser.Id) - .Select(x => ShareLinkResponse.GetFromEf(x)).ToListAsync(); + .Select(x => ShareLinkResponse.GetFromEf(x)).ToArrayAsync(); return RespondSuccessLegacy(ownShareLinks); } diff --git a/API/Controller/Shares/V2GetShares.cs b/API/Controller/Shares/V2GetShares.cs index fb03d65d..93c061cd 100644 --- a/API/Controller/Shares/V2GetShares.cs +++ b/API/Controller/Shares/V2GetShares.cs @@ -17,7 +17,7 @@ public sealed partial class SharesController [HttpGet] [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [ApiVersion("2")] - public async Task> GetSharesByUsers() + public async Task GetSharesByUsers() { var sharedToUsers = await _db.ShockerShares.Where(x => x.Shocker.DeviceNavigation.Owner == CurrentUser.Id) .Select(x => new GenericIni @@ -25,12 +25,12 @@ public async Task> GetSharesByUsers() Id = x.SharedWithNavigation.Id, Image = x.SharedWithNavigation.GetImageUrl(), Name = x.SharedWithNavigation.Name - }).OrderBy(x => x.Name).Distinct().ToListAsync(); + }).OrderBy(x => x.Name).Distinct().ToArrayAsync(); return sharedToUsers; } [HttpGet("{userId:guid}")] - [ProducesResponseType(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [ProducesResponseType(StatusCodes.Status404NotFound, MediaTypeNames.Application.ProblemJson)] // UserNotFound [ApiVersion("2")] public async Task GetSharesToUser(Guid userId) @@ -54,9 +54,9 @@ public async Task GetSharesToUser(Guid userId) Intensity = x.LimitIntensity }, Paused = x.Paused - }).ToListAsync(); + }).ToArrayAsync(); - if(sharedWithUser.Count == 0) + if(sharedWithUser.Length == 0) { return Problem(ShareError.ShareGetNoShares); } diff --git a/API/Controller/Shares/V2Requests.cs b/API/Controller/Shares/V2Requests.cs index b89a2204..bf21e0e4 100644 --- a/API/Controller/Shares/V2Requests.cs +++ b/API/Controller/Shares/V2Requests.cs @@ -16,9 +16,9 @@ namespace OpenShock.API.Controller.Shares; public sealed partial class SharesController { [HttpGet("requests/outstanding")] - [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [ApiVersion("2")] - public async Task> GetOutstandingRequestsList() + public async Task GetOutstandingRequestsList() { var outstandingShares = await _db.ShareRequests.Where(x => x.Owner == CurrentUser.Id) .Select(x => new ShareRequestBaseItem() @@ -43,15 +43,15 @@ public async Task> GetOutstandingRequestsList( { Shockers = x.ShareRequestsShockers.Count } - }).ToListAsync(); + }).ToArrayAsync(); return outstandingShares; } [HttpGet("requests/incoming")] - [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] [ApiVersion("2")] - public async Task> GetIncomingRequestsList() + public async Task GetIncomingRequestsList() { var outstandingShares = await _db.ShareRequests.Where(x => x.User == CurrentUser.Id) .Select(x => new ShareRequestBaseItem @@ -76,7 +76,7 @@ public async Task> GetIncomingRequestsList() { Shockers = x.ShareRequestsShockers.Count } - }).ToListAsync(); + }).ToArrayAsync(); return outstandingShares; } diff --git a/API/Controller/Shockers/ControlLogController.cs b/API/Controller/Shockers/ControlLogController.cs index 494040bd..1f4d9b6c 100644 --- a/API/Controller/Shockers/ControlLogController.cs +++ b/API/Controller/Shockers/ControlLogController.cs @@ -56,7 +56,7 @@ [FromQuery] [Range(1, 500)] uint limit = 100) Image = x.ControlledByNavigation.GetImageUrl(), CustomName = x.CustomName } - }).ToListAsync(); + }).ToArrayAsync(); return RespondSuccessLegacy(logs); } diff --git a/API/Controller/Shockers/OwnShockerController.cs b/API/Controller/Shockers/OwnShockerController.cs index f2fe191f..62f17cce 100644 --- a/API/Controller/Shockers/OwnShockerController.cs +++ b/API/Controller/Shockers/OwnShockerController.cs @@ -34,7 +34,7 @@ public async Task ListShockers() Model = y.Model, IsPaused = y.Paused }) - }).ToListAsync(); + }).ToArrayAsync(); return RespondSuccessLegacy(shockers); } diff --git a/API/Controller/Shockers/ShareShockerController.cs b/API/Controller/Shockers/ShareShockerController.cs index 1d9efbef..fb5e81d0 100644 --- a/API/Controller/Shockers/ShareShockerController.cs +++ b/API/Controller/Shockers/ShareShockerController.cs @@ -57,7 +57,7 @@ public async Task GetShockerShares([FromRoute] Guid shockerId) Intensity = x.LimitIntensity } } - ).ToListAsync(); + ).ToArrayAsync(); return RespondSuccessLegacy(shares); } @@ -82,7 +82,7 @@ public async Task ShockerShareCodeList([FromRoute] Guid shockerId CreatedOn = x.CreatedOn, Id = x.Id } - ).ToListAsync(); + ).ToArrayAsync(); return RespondSuccessLegacy(shares); } diff --git a/API/Controller/Shockers/SharedShockersController.cs b/API/Controller/Shockers/SharedShockersController.cs index efcd664d..74b6b2c1 100644 --- a/API/Controller/Shockers/SharedShockersController.cs +++ b/API/Controller/Shockers/SharedShockersController.cs @@ -46,7 +46,7 @@ public async Task ListSharedShockers() Intensity = x.LimitIntensity } } - }).ToListAsync(); + }).ToArrayAsync(); var shared = new Dictionary(); foreach (var shocker in sharedShockersRaw) diff --git a/API/Controller/Tokens/TokenController.cs b/API/Controller/Tokens/TokenController.cs index 67d6ec79..9d42ea43 100644 --- a/API/Controller/Tokens/TokenController.cs +++ b/API/Controller/Tokens/TokenController.cs @@ -26,10 +26,10 @@ public sealed partial class TokensController /// All tokens for the current user [HttpGet] [Authorize(Policy = OpenShockAuthPolicies.UserAccess)] - [ProducesResponseType>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] - public async Task> ListTokens() + [ProducesResponseType(StatusCodes.Status200OK, MediaTypeNames.Application.Json)] + public async Task ListTokens() { - var apiTokens = await _db.ApiTokens + return await _db.ApiTokens .Where(x => x.UserId == CurrentUser.Id && (x.ValidUntil == null || x.ValidUntil > DateTime.UtcNow)) .OrderBy(x => x.CreatedOn) .Select(x => new TokenResponse @@ -40,9 +40,7 @@ public async Task> ListTokens() Permissions = x.Permissions, Name = x.Name, Id = x.Id - }).ToListAsync(); - - return apiTokens; + }).ToArrayAsync(); } /// diff --git a/API/Program.cs b/API/Program.cs index 047eca83..70614316 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -99,9 +99,9 @@ Log.Information("Running database migrations..."); using var scope = app.Services.CreateScope(); var openShockContext = scope.ServiceProvider.GetRequiredService(); - var pendingMigrations = openShockContext.Database.GetPendingMigrations().ToList(); + var pendingMigrations = openShockContext.Database.GetPendingMigrations().ToArray(); - if (pendingMigrations.Count > 0) + if (pendingMigrations.Length > 0) { Log.Information("Found pending migrations, applying [{@Migrations}]", pendingMigrations); openShockContext.Database.Migrate(); diff --git a/Common/DeviceControl/ControlLogic.cs b/Common/DeviceControl/ControlLogic.cs index 89490037..8befd7a9 100644 --- a/Common/DeviceControl/ControlLogic.cs +++ b/Common/DeviceControl/ControlLogic.cs @@ -48,7 +48,7 @@ public static async Task Init() var parents = field.GetCustomAttributes().Select(x => x.PermissionType); var name = field.GetCustomAttribute()!.PgName; - yield return new PermissionTypeRecord(permissionType, name, parents.ToList()); + yield return new PermissionTypeRecord(permissionType, name, parents.ToArray()); } } } diff --git a/Common/OpenShockServiceHelper.cs b/Common/OpenShockServiceHelper.cs index 9e4ec327..dbac57ea 100644 --- a/Common/OpenShockServiceHelper.cs +++ b/Common/OpenShockServiceHelper.cs @@ -32,10 +32,10 @@ public static class OpenShockServiceHelper // TODO: this is temporary while we still rely on enums for user ranks static bool HandleRankCheck(AuthorizationHandlerContext context, RankType requiredRank) { - var ranks = context.User.Identities.SelectMany(ident => ident.Claims.Where(claim => claim.Type == ident.RoleClaimType)).Select(claim => Enum.Parse(claim.Value)).ToList(); + var ranks = context.User.Identities.SelectMany(ident => ident.Claims.Where(claim => claim.Type == ident.RoleClaimType)).Select(claim => Enum.Parse(claim.Value)).ToArray(); // Has any rank that is higher than required rank - return ranks.Count != 0 && ranks.Max() >= requiredRank; + return ranks.Length != 0 && ranks.Max() >= requiredRank; } /// diff --git a/Common/Swagger/AttributeFilter.cs b/Common/Swagger/AttributeFilter.cs index 6e606476..48e67330 100644 --- a/Common/Swagger/AttributeFilter.cs +++ b/Common/Swagger/AttributeFilter.cs @@ -45,21 +45,21 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) var attributes = context.MethodInfo?.DeclaringType?.GetCustomAttributes(true) .Union(context.MethodInfo.GetCustomAttributes(true)) .OfType() - .ToList() ?? []; + .ToArray() ?? []; - if (attributes.Count != 0) + if (attributes.Length != 0) { if (attributes.Count(attr => !string.IsNullOrEmpty(attr.AuthenticationSchemes)) > 1) throw new Exception("Dunno what to apply to this method (multiple authentication attributes with schemes set)"); var scheme = attributes.Select(attr => attr.AuthenticationSchemes).SingleOrDefault(scheme => !string.IsNullOrEmpty(scheme)); - var roles = attributes.Select(attr => attr.Roles).Where(roles => !string.IsNullOrEmpty(roles)).SelectMany(roles => roles!.Split(',')).Select(role => role.Trim()).ToList(); - var policies = attributes.Select(attr => attr.Policy).Where(policies => !string.IsNullOrEmpty(policies)).SelectMany(policies => policies!.Split(',')).Select(policy => policy.Trim()).ToList(); + var roles = attributes.Select(attr => attr.Roles).Where(roles => !string.IsNullOrEmpty(roles)).SelectMany(roles => roles!.Split(',')).Select(role => role.Trim()).ToArray(); + var policies = attributes.Select(attr => attr.Policy).Where(policies => !string.IsNullOrEmpty(policies)).SelectMany(policies => policies!.Split(',')).Select(policy => policy.Trim()).ToArray(); // Add what should be show inside the security section List securityInfos = []; if (!string.IsNullOrEmpty(scheme)) securityInfos.Add($"{nameof(AuthorizeAttribute.AuthenticationSchemes)}:{scheme}"); - if (roles.Count > 0) securityInfos.Add($"{nameof(AuthorizeAttribute.Roles)}:{string.Join(',', roles)}"); - if (policies.Count > 0) securityInfos.Add($"{nameof(AuthorizeAttribute.Policy)}:{string.Join(',', policies)}"); + if (roles.Length > 0) securityInfos.Add($"{nameof(AuthorizeAttribute.Roles)}:{string.Join(',', roles)}"); + if (policies.Length > 0) securityInfos.Add($"{nameof(AuthorizeAttribute.Policy)}:{string.Join(',', policies)}"); List securityRequirements = []; foreach (var authenticationScheme in scheme?.Split(',').Select(s => s.Trim()) ?? []) diff --git a/Common/Swagger/SwaggerGenExtensions.cs b/Common/Swagger/SwaggerGenExtensions.cs index 702dae11..571d02c8 100644 --- a/Common/Swagger/SwaggerGenExtensions.cs +++ b/Common/Swagger/SwaggerGenExtensions.cs @@ -29,7 +29,7 @@ public static IServiceCollection AddSwaggerExt(this IServiceCollection .Select(v => v.ToString()) .ToHashSet() .OrderBy(v => v) - .ToList(); + .ToArray(); if (versions.Any(v => !int.TryParse(v, out _))) {