🐛 Add missing logout device
This commit is contained in:
@@ -509,6 +509,23 @@ public class AccountCurrentController(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpDelete("devices/{deviceId}")]
|
||||||
|
[Authorize]
|
||||||
|
public async Task<ActionResult<AuthSession>> DeleteDevice(string deviceId)
|
||||||
|
{
|
||||||
|
if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await accounts.DeleteDevice(currentUser, deviceId);
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return BadRequest(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[HttpDelete("sessions/current")]
|
[HttpDelete("sessions/current")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public async Task<ActionResult<AuthSession>> DeleteCurrentSession()
|
public async Task<ActionResult<AuthSession>> DeleteCurrentSession()
|
||||||
|
@@ -492,7 +492,7 @@ public class AccountService(
|
|||||||
{
|
{
|
||||||
if (!await IsDeviceActive(session.Challenge.ClientId.Value))
|
if (!await IsDeviceActive(session.Challenge.ClientId.Value))
|
||||||
await pusher.UnsubscribePushNotificationsAsync(new UnsubscribePushNotificationsRequest()
|
await pusher.UnsubscribePushNotificationsAsync(new UnsubscribePushNotificationsRequest()
|
||||||
{ DeviceId = session.Challenge.Client!.DeviceId }
|
{ DeviceId = session.Challenge.Client!.DeviceId }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,6 +506,31 @@ public class AccountService(
|
|||||||
await cache.RemoveAsync($"{DysonTokenAuthHandler.AuthCachePrefix}{item.Id}");
|
await cache.RemoveAsync($"{DysonTokenAuthHandler.AuthCachePrefix}{item.Id}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task DeleteDevice(Account account, string deviceId)
|
||||||
|
{
|
||||||
|
var device = await db.AuthClients.FirstOrDefaultAsync(c => c.DeviceId == deviceId && c.AccountId == account.Id);
|
||||||
|
if (device is null)
|
||||||
|
throw new InvalidOperationException("Device not found.");
|
||||||
|
|
||||||
|
await pusher.UnsubscribePushNotificationsAsync(
|
||||||
|
new UnsubscribePushNotificationsRequest() { DeviceId = device.DeviceId }
|
||||||
|
);
|
||||||
|
|
||||||
|
var sessions = await db.AuthSessions
|
||||||
|
.Include(s => s.Challenge)
|
||||||
|
.Where(s => s.Challenge.ClientId == device.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
// The current session should be included in the sessions' list
|
||||||
|
await db.AuthSessions
|
||||||
|
.Include(s => s.Challenge)
|
||||||
|
.Where(s => s.Challenge.DeviceId == device.DeviceId)
|
||||||
|
.ExecuteDeleteAsync();
|
||||||
|
|
||||||
|
foreach (var item in sessions)
|
||||||
|
await cache.RemoveAsync($"{DysonTokenAuthHandler.AuthCachePrefix}{item.Id}");
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<AccountContact> CreateContactMethod(Account account, AccountContactType type, string content)
|
public async Task<AccountContact> CreateContactMethod(Account account, AccountContactType type, string content)
|
||||||
{
|
{
|
||||||
var isExists = await db.AccountContacts
|
var isExists = await db.AccountContacts
|
||||||
|
Reference in New Issue
Block a user