Skip to content

Commit 5eaab8a

Browse files
hhvrcLucHeart
andauthored
Shares rework (#194)
Co-authored-by: LucHeart <luc@luc.cat>
1 parent a01538b commit 5eaab8a

24 files changed

Lines changed: 1997 additions & 386 deletions

API/Controller/Devices/DevicesController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public async Task<IActionResult> GetLiveControlGatewayInfo([FromRoute] Guid devi
228228
{
229229
// Check if user owns device or has a share
230230
var deviceExistsAndYouHaveAccess = await _db.Devices.AnyAsync(x =>
231-
x.Id == deviceId && (x.OwnerId == CurrentUser.Id || x.Shockers.Any(y => y.ShockerShares.Any(
231+
x.Id == deviceId && (x.OwnerId == CurrentUser.Id || x.Shockers.Any(y => y.UserShares.Any(
232232
z => z.SharedWithUserId == CurrentUser.Id))));
233233
if (!deviceExistsAndYouHaveAccess) return Problem(DeviceError.DeviceNotFound);
234234

API/Controller/Shares/LinkShareCode.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ [FromServices] IDeviceUpdateService deviceUpdateService
3737
}).FirstOrDefaultAsync();
3838
if (shareCode == null) return Problem(ShareCodeError.ShareCodeNotFound);
3939
if (shareCode.OwnerId == CurrentUser.Id) return Problem(ShareCodeError.CantLinkOwnShareCode);
40-
if (await _db.ShockerShares.AnyAsync(x => x.ShockerId == shareCode.Share.ShockerId && x.SharedWithUserId == CurrentUser.Id))
40+
if (await _db.UserShares.AnyAsync(x => x.ShockerId == shareCode.Share.ShockerId && x.SharedWithUserId == CurrentUser.Id))
4141
return Problem(ShareCodeError.ShockerAlreadyLinked);
4242

43-
_db.ShockerShares.Add(new ShockerShare
43+
_db.UserShares.Add(new UserShare
4444
{
45-
ShockerId = shareCode.Share.ShockerId,
4645
SharedWithUserId = CurrentUser.Id,
46+
ShockerId = shareCode.Share.ShockerId,
4747
AllowShock = shareCode.Share.AllowShock,
4848
AllowVibrate = shareCode.Share.AllowVibrate,
4949
AllowSound = shareCode.Share.AllowSound,

API/Controller/Shares/V2CreateShareRequest.cs renamed to API/Controller/Shares/V2CreateShareInvite.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,25 @@ namespace OpenShock.API.Controller.Shares;
1212

1313
public sealed partial class SharesController
1414
{
15-
[HttpPost("requests")]
15+
[HttpPost("invites")]
1616
[ProducesResponseType<Guid>(StatusCodes.Status200OK, MediaTypeNames.Text.Plain)]
1717
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status404NotFound, MediaTypeNames.Application.ProblemJson)] // UserNotFound, ShareCreateShockerNotFound
1818
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status400BadRequest, MediaTypeNames.Application.ProblemJson)] // ShareCreateCannotShareWithSelf
1919
[ApiVersion("2")]
20-
public async Task<IActionResult> CreateShare([FromBody] CreateShareRequest data)
20+
public async Task<IActionResult> CreateShareInvite([FromBody] CreateShareRequest body)
2121
{
22-
if (data.User == CurrentUser.Id)
22+
if (body.User == CurrentUser.Id)
2323
{
2424
return Problem(ShareError.ShareRequestCreateCannotShareWithSelf);
2525
}
2626

27-
var providedShockerIds = data.Shockers.Select(x => x.Id).ToArray();
27+
var providedShockerIds = body.Shockers.Select(x => x.Id).ToArray();
2828
var belongsToUsFuture = _db.Shockers.AsNoTracking().Where(x =>
2929
x.Device.OwnerId == CurrentUser.Id && providedShockerIds.Contains(x.Id)).Select(x => x.Id).Future();
3030

31-
if (data.User != null)
31+
if (body.User != null)
3232
{
33-
var existsFuture = _db.Users.AsNoTracking().DeferredAny(x => x.Id == data.User).FutureValue();
33+
var existsFuture = _db.Users.AsNoTracking().DeferredAny(x => x.Id == body.User).FutureValue();
3434

3535
// We can already resolve the futures here since this is the last future query
3636
if (!await existsFuture.ValueAsync()) return Problem(UserError.UserNotFound);
@@ -47,26 +47,26 @@ public async Task<IActionResult> CreateShare([FromBody] CreateShareRequest data)
4747

4848
await using var transaction = await _db.Database.BeginTransactionAsync();
4949

50-
var shareRequest = new ShareRequest
50+
var shareInvite = new UserShareInvite
5151
{
5252
Id = Guid.CreateVersion7(),
5353
OwnerId = CurrentUser.Id,
54-
UserId = data.User
54+
RecipientUserId = body.User
5555
};
56-
_db.ShareRequests.Add(shareRequest);
56+
_db.UserShareInvites.Add(shareInvite);
5757

58-
foreach (var createShockerShare in data.Shockers)
58+
foreach (var createUserShare in body.Shockers)
5959
{
60-
_db.ShareRequestShockerMappings.Add(new ShareRequestShocker
60+
_db.UserShareInviteShockers.Add(new UserShareInviteShocker
6161
{
62-
ShareRequestId = shareRequest.Id,
63-
ShockerId = createShockerShare.Id,
64-
AllowShock = createShockerShare.Permissions.Shock,
65-
AllowVibrate = createShockerShare.Permissions.Vibrate,
66-
AllowSound = createShockerShare.Permissions.Sound,
67-
AllowLiveControl = createShockerShare.Permissions.Live,
68-
MaxIntensity = createShockerShare.Limits.Intensity,
69-
MaxDuration = createShockerShare.Limits.Duration,
62+
InviteId = shareInvite.Id,
63+
ShockerId = createUserShare.Id,
64+
AllowShock = createUserShare.Permissions.Shock,
65+
AllowVibrate = createUserShare.Permissions.Vibrate,
66+
AllowSound = createUserShare.Permissions.Sound,
67+
AllowLiveControl = createUserShare.Permissions.Live,
68+
MaxIntensity = createUserShare.Limits.Intensity,
69+
MaxDuration = createUserShare.Limits.Duration,
7070
IsPaused = false
7171
});
7272
}
@@ -75,6 +75,6 @@ public async Task<IActionResult> CreateShare([FromBody] CreateShareRequest data)
7575

7676
await transaction.CommitAsync();
7777

78-
return Ok(shareRequest.Id);
78+
return Ok(shareInvite.Id);
7979
}
8080
}

API/Controller/Shares/V2GetShares.cs

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,25 @@
33
using Microsoft.EntityFrameworkCore;
44
using OpenShock.API.Models.Response;
55
using OpenShock.Common.Extensions;
6+
using Z.EntityFramework.Plus;
67

78
namespace OpenShock.API.Controller.Shares;
89

910
public sealed partial class SharesController
1011
{
1112
[HttpGet]
1213
[ApiVersion("2")]
13-
public IAsyncEnumerable<V2UserSharesListItem> GetSharesByUsers()
14+
public async Task<V2UserShares> GetSharesByUsers(CancellationToken cancellationToken)
1415
{
15-
return _db.ShockerShares
16+
_db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
17+
18+
var outgoingSharesFuture = _db.UserShares
1619
.Where(x => x.Shocker.Device.OwnerId == CurrentUser.Id)
17-
.AsNoTracking()
1820
.GroupBy(x => x.SharedWithUserId)
19-
.Select(g => new V2UserSharesListItem
21+
.Select(g => new V2UserSharesListItemDto
2022
{
2123
Id = g.Key,
22-
Image = g.First().SharedWithUser.GetImageUrl(),
24+
Email = g.First().SharedWithUser.Email,
2325
Name = g.First().SharedWithUser.Name,
2426
Shares = g.Select(y => new UserShareInfo
2527
{
@@ -42,6 +44,49 @@ public IAsyncEnumerable<V2UserSharesListItem> GetSharesByUsers()
4244
})
4345
.ToArray()
4446
})
45-
.AsAsyncEnumerable();
47+
.Future();
48+
49+
var incomingSharesFuture = _db.UserShares
50+
.Where(x => x.SharedWithUserId == CurrentUser.Id)
51+
.GroupBy(x => x.Shocker.Device.OwnerId)
52+
.Select(g => new V2UserSharesListItemDto
53+
{
54+
Id = g.Key,
55+
Email = g.First().Shocker.Device.Owner.Email,
56+
Name = g.First().Shocker.Device.Owner.Name,
57+
Shares = g.Select(y => new UserShareInfo
58+
{
59+
Id = y.Shocker.Id,
60+
Name = y.Shocker.Name,
61+
CreatedOn = y.CreatedAt,
62+
Permissions = new ShockerPermissions
63+
{
64+
Sound = y.AllowSound,
65+
Vibrate = y.AllowVibrate,
66+
Shock = y.AllowShock,
67+
Live = y.AllowLiveControl
68+
},
69+
Limits = new ShockerLimits
70+
{
71+
Duration = y.MaxDuration,
72+
Intensity = y.MaxIntensity
73+
},
74+
Paused = y.IsPaused
75+
})
76+
.ToArray()
77+
})
78+
.Future();
79+
80+
return new V2UserShares
81+
{
82+
Outgoing = (await outgoingSharesFuture.ToArrayAsync(cancellationToken)).Select(x => x.FromDto()),
83+
Incoming = (await incomingSharesFuture.ToArrayAsync(cancellationToken)).Select(x => x.FromDto())
84+
};
85+
}
86+
87+
public sealed class V2UserShares
88+
{
89+
public required IEnumerable<V2UserSharesListItem> Outgoing { get; set; }
90+
public required IEnumerable<V2UserSharesListItem> Incoming { get; set; }
4691
}
4792
}

0 commit comments

Comments
 (0)