Skip to content

Commit 20e6cfa

Browse files
committed
fix(signage): playlist filtering using orientation
1 parent 2fd46fc commit 20e6cfa

File tree

2 files changed

+60
-21
lines changed

2 files changed

+60
-21
lines changed

spec/playlist_spec.cr

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,24 @@ module PlaceOS::Model
5555
cs.playlists.size.should eq 0
5656
end
5757

58-
it "finds all the playlist ids associated with a system" do
58+
it "finds all the playlist ids associated with a system", focus: true do
5959
playlist = Generator.playlist
6060
playlist.save!
6161
play_id = playlist.id.as(String)
6262

63+
playlist = Generator.playlist
64+
playlist.save!
65+
play_id2 = playlist.id.as(String)
66+
6367
cs = Generator.control_system
64-
cs.playlists = [play_id]
68+
cs.playlists = [play_id2]
6569

6670
zone = Generator.zone
6771
zone.playlists = [play_id]
6872
zone.save!
6973

7074
zone2 = Generator.zone
71-
zone2.playlists = [play_id]
75+
zone2.playlists = [play_id2]
7276
zone2.save!
7377

7478
cs.zones = [zone.id.as(String), zone2.id.as(String)]
@@ -80,16 +84,36 @@ module PlaceOS::Model
8084
trigger.save!
8185

8286
trigger2 = Generator.trigger_instance control_system: cs
83-
trigger2.playlists = [play_id]
87+
trigger2.playlists = [play_id2]
8488
trigger2.save!
8589

8690
cs = ControlSystem.find(cs_id)
8791
cs.all_playlists.should eq({
88-
cs_id => [play_id],
92+
cs_id => [play_id2],
93+
zone.id.as(String) => [play_id],
94+
zone2.id.as(String) => [play_id2],
95+
trigger.id.as(String) => [play_id],
96+
trigger2.id.as(String) => [play_id2],
97+
})
98+
99+
# playlists default to this orientation
100+
cs.orientation = PlaceOS::Model::Playlist::Orientation::Portrait
101+
cs.save!
102+
cs.all_playlists.should eq({
103+
cs_id => [play_id2],
89104
zone.id.as(String) => [play_id],
90-
zone2.id.as(String) => [play_id],
105+
zone2.id.as(String) => [play_id2],
91106
trigger.id.as(String) => [play_id],
92-
trigger2.id.as(String) => [play_id],
107+
trigger2.id.as(String) => [play_id2],
108+
})
109+
110+
# playlists directly assigned to the display should not be filtered
111+
playlist.orientation = PlaceOS::Model::Playlist::Orientation::Landscape
112+
playlist.save!
113+
cs.all_playlists.should eq({
114+
cs_id => [play_id2],
115+
zone.id.as(String) => [play_id],
116+
trigger.id.as(String) => [play_id],
93117
})
94118
end
95119

src/placeos-models/control_system.cr

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -386,26 +386,41 @@ module PlaceOS::Model
386386
# then construct a hash
387387
sys_id = self.id.as(String)
388388
sql_query = %[
389-
WITH zone_ids AS (
390-
SELECT UNNEST(zones) as zone_id
389+
WITH settings AS (
390+
SELECT
391+
zones,
392+
orientation
391393
FROM sys
392394
WHERE id = $1
393395
),
394-
zone_playlists AS (
395-
SELECT z.id, z.playlists
396+
all_playlists AS (
397+
-- unnest() in the SELECT is implicitly lateral
398+
SELECT
399+
z.id AS source_id,
400+
unnest(z.playlists) AS playlist_id
396401
FROM zone z
397-
INNER JOIN zone_ids zi ON z.id = zi.zone_id
398-
WHERE cardinality(z.playlists) > 0
399-
),
400-
trig_playlists AS (
401-
SELECT t.id, t.playlists
402+
JOIN settings st
403+
ON z.id = ANY(st.zones)
404+
405+
UNION ALL
406+
407+
SELECT
408+
t.id,
409+
unnest(t.playlists)
402410
FROM trig t
403-
WHERE t.control_system_id = $1 AND cardinality(t.playlists) > 0
411+
WHERE t.control_system_id = $1
404412
)
405-
406-
SELECT id, playlists FROM zone_playlists
407-
UNION ALL
408-
SELECT id, playlists FROM trig_playlists;
413+
SELECT
414+
ap.source_id,
415+
array_agg(ap.playlist_id ORDER BY ap.playlist_id) AS playlists
416+
FROM all_playlists ap
417+
JOIN settings st ON TRUE
418+
JOIN playlists p ON p.id = ap.playlist_id
419+
WHERE
420+
st.orientation = 'UNSPECIFIED'
421+
OR p.orientation = st.orientation
422+
OR p.orientation = 'UNSPECIFIED'
423+
GROUP BY ap.source_id;
409424
]
410425

411426
playlists = {

0 commit comments

Comments
 (0)