Skip to content

Commit 3accf7c

Browse files
committed
Try selecting own and shared shockers in single query
1 parent 196fcad commit 3accf7c

1 file changed

Lines changed: 24 additions & 33 deletions

File tree

Common/Services/ControlSender.cs

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using OpenShock.Common.Redis.PubSub;
1313
using OpenShock.Common.Services.RedisPubSub;
1414
using OpenShock.Common.Utils;
15+
using Z.EntityFramework.Plus;
1516

1617
namespace OpenShock.Common.Services;
1718

@@ -28,45 +29,35 @@ public ControlSender(OpenShockContext db, IRedisPubService publisher)
2829

2930
public async Task<OneOf<Success, ShockerNotFoundOrNoAccess, ShockerPaused, ShockerNoPermission>> ControlByUser(IReadOnlyList<Control> controls,ControlLogSender sender, IHubClients<IUserHub> hubClients)
3031
{
31-
var queryOwn = _db.Shockers
32+
var shockers = await _db.Shockers
3233
.AsNoTracking()
33-
.Where(x => x.Device.OwnerId == sender.Id)
34-
.Select(x => new ControlShockerObj
34+
.Select(shocker => new
3535
{
36-
ShockerId = x.Id,
37-
ShockerName = x.Name,
38-
ShockerRfId = x.RfId,
39-
DeviceId = x.DeviceId,
40-
ShockerModel = x.Model,
41-
OwnerId = x.Device.OwnerId,
42-
Paused = x.IsPaused,
43-
PermsAndLimits = null
44-
});
45-
46-
var queryShared = _db.UserShares
47-
.AsNoTracking()
48-
.Where(x => x.SharedWithUserId == sender.Id)
36+
shocker,
37+
shocker.Device.OwnerId,
38+
Share = shocker.UserShares.FirstOrDefault(us => us.SharedWithUserId == sender.Id)
39+
})
40+
.Where(x => x.OwnerId == sender.Id || x.Share != null)
4941
.Select(x => new ControlShockerObj
5042
{
51-
ShockerId = x.Shocker.Id,
52-
ShockerName = x.Shocker.Name,
53-
ShockerRfId = x.Shocker.RfId,
54-
DeviceId = x.Shocker.DeviceId,
55-
ShockerModel = x.Shocker.Model,
56-
OwnerId = x.Shocker.Device.OwnerId,
57-
Paused = x.Shocker.IsPaused || x.IsPaused,
58-
PermsAndLimits = new SharePermsAndLimits
43+
ShockerId = x.shocker.Id,
44+
ShockerName = x.shocker.Name,
45+
ShockerRfId = x.shocker.RfId,
46+
DeviceId = x.shocker.DeviceId,
47+
ShockerModel = x.shocker.Model,
48+
OwnerId = x.OwnerId,
49+
Paused = x.shocker.IsPaused || (x.Share != null && x.Share.IsPaused),
50+
PermsAndLimits = x.Share == null ? null : new SharePermsAndLimits
5951
{
60-
Sound = x.AllowSound,
61-
Vibrate = x.AllowVibrate,
62-
Shock = x.AllowShock,
63-
Duration = x.MaxDuration,
64-
Intensity = x.MaxIntensity,
65-
Live = x.AllowLiveControl
52+
Sound = x.Share.AllowSound,
53+
Vibrate = x.Share.AllowVibrate,
54+
Shock = x.Share.AllowShock,
55+
Duration = x.Share.MaxDuration,
56+
Intensity = x.Share.MaxIntensity,
57+
Live = x.Share.AllowLiveControl
6658
}
67-
});
68-
69-
var shockers = await queryOwn.Concat(queryShared).ToArrayAsync();
59+
})
60+
.ToArrayAsync();
7061

7162
return await ControlInternal(controls, sender, hubClients, shockers);
7263
}

0 commit comments

Comments
 (0)