Compare commits

...

305 Commits
M2 ... dev

Author SHA1 Message Date
Claudio Maggioni (maggicl)
109d2a4d44 Merge branch 'dev' of https://lab.si.usi.ch/sa4-2020/the-sanmarinoes/backend into dev 2021-02-14 12:23:25 +01:00
Claudio Maggioni (maggicl)
0ea0365c00 Fixed email sender for custom emails 2021-02-12 22:44:51 +01:00
3eea344b6f Merge branch '92-inputdeviceconnectioncontroller-tests' into 'dev'
Resolve "inputDeviceConnectionController Tests"

Closes #92

See merge request sa4-2020/the-sanmarinoes/backend!210
2020-05-27 22:51:56 +02:00
Claudio Maggioni (maggicl)
c3b91cd1d1 Fixed tests 2020-05-27 22:51:37 +02:00
4e9d77c794 Merge branch 'tests' into 'dev'
Fix bug

See merge request sa4-2020/the-sanmarinoes/backend!209
2020-05-27 22:39:40 +02:00
Claudio Maggioni (maggicl)
dfb27c7654 Fix bug 2020-05-27 22:39:25 +02:00
2708c438ba Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!208
2020-05-27 22:30:40 +02:00
Claudio Maggioni (maggicl)
7371999cc7 Tests 2020-05-27 22:29:59 +02:00
f646ce38a5 Merge branch 'tests' into 'dev'
Four letters can change the behaviour of a piece of code a lot

See merge request sa4-2020/the-sanmarinoes/backend!207
2020-05-27 22:07:16 +02:00
Claudio Maggioni (maggicl)
ea6f93d6f1 Four letters can change the behaviour of a piece of code a lot 2020-05-27 22:06:52 +02:00
Matteo Omenetti
8f3df8e96f Merge branch '97-fix-sensor' into 'dev'
fix

Closes #97

See merge request sa4-2020/the-sanmarinoes/backend!206
2020-05-27 18:31:13 +02:00
omenem
50d7c77177 fix 2020-05-27 18:28:21 +02:00
omenem
66b22064b4 fix 2020-05-27 18:24:45 +02:00
omenem
71302933e6 fix 2020-05-27 18:20:00 +02:00
omenem
a843786759 wip 2020-05-27 16:21:30 +02:00
Matteo Omenetti
d62fe005a8 Merge branch '96-fix-in-random-jitter-of-thermostat' into 'dev'
fix

Closes #96

See merge request sa4-2020/the-sanmarinoes/backend!205
2020-05-27 14:54:37 +02:00
omenem
b2ef4e0904 fix 2020-05-27 14:50:14 +02:00
3bb8f1b394 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!204
2020-05-27 11:52:58 +02:00
Claudio Maggioni (maggicl)
f230bd8937 Tests 2020-05-27 11:52:44 +02:00
101f8a9398 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!203
2020-05-27 11:43:19 +02:00
Claudio Maggioni (maggicl)
2aa6718424 Tests 2020-05-27 11:42:55 +02:00
c8470d7a5d Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!202
2020-05-27 11:33:02 +02:00
Claudio Maggioni (maggicl)
9489fe9140 Tests 2020-05-27 11:32:44 +02:00
4283b4a28b Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!201
2020-05-27 11:14:34 +02:00
Claudio Maggioni (maggicl)
69aaf9920f Tests 2020-05-27 11:14:19 +02:00
c7de5ca437 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!200
2020-05-27 10:35:05 +02:00
Claudio Maggioni (maggicl)
ec93ff22cc Tests 2020-05-27 10:34:48 +02:00
57f5415d61 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!199
2020-05-27 10:11:14 +02:00
Claudio Maggioni (maggicl)
a2470d132d Tests 2020-05-27 10:11:00 +02:00
c48d610621 Merge branch 'tests' into 'dev'
Imported tests from Google

See merge request sa4-2020/the-sanmarinoes/backend!198
2020-05-27 09:48:52 +02:00
Claudio Maggioni (maggicl)
7a4bdbcf3c Imported tests from Google 2020-05-27 09:48:32 +02:00
cea18bb2a8 Merge branch 'tests' into 'dev'
WIP

See merge request sa4-2020/the-sanmarinoes/backend!197
2020-05-27 00:21:13 +02:00
Claudio Maggioni (maggicl)
c705febde0 WIP 2020-05-27 00:20:32 +02:00
a5bbe87e4d Merge branch 'userstory3fix-fil-new-new' into 'dev'
Wip

See merge request sa4-2020/the-sanmarinoes/backend!196
2020-05-27 00:07:12 +02:00
ca586020ba Merge branch '88-device-controller-test' into 'dev'
Resolve "device controller test"

Closes #88

See merge request sa4-2020/the-sanmarinoes/backend!188
2020-05-27 00:06:23 +02:00
Claudio Maggioni (maggicl)
9125111708 Wip 2020-05-27 00:01:55 +02:00
Matteo Omenetti
b8b55d4efb Merge branch '94-tests' into 'dev'
test equal

Closes #94

See merge request sa4-2020/the-sanmarinoes/backend!195
2020-05-26 18:58:32 +02:00
omenem
bbf13d4bef test equal 2020-05-26 18:55:21 +02:00
Matteo Omenetti
86c87ece65 Merge branch '93-miscellaneous-tests' into 'dev'
Resolve "miscellaneous tests"

Closes #93

See merge request sa4-2020/the-sanmarinoes/backend!194
2020-05-26 18:46:14 +02:00
omenem
1a1aa35a5b sensor 2020-05-26 18:42:56 +02:00
omenem
5e9a83da8b scene service 2020-05-26 18:39:03 +02:00
omenem
e12163d2eb Thermostat 2020-05-26 18:18:38 +02:00
omenem
3e2eb231a0 Sensor 2020-05-26 18:13:42 +02:00
omenem
1aab50c9f8 Thermostat 2020-05-26 18:09:26 +02:00
omenem
7d634c0739 wip 2020-05-26 17:59:38 +02:00
Matteo Omenetti
9a86220a79 Merge branch '90-dimmablestatecontroller-tests' into 'dev'
Resolve "DimmableStateController tests"

Closes #90

See merge request sa4-2020/the-sanmarinoes/backend!193
2020-05-26 17:23:56 +02:00
Matteo Omenetti
92ef722ec0 Merge branch '85-motionsensorcontroller-test' into 'dev'
Resolve "motionSensorController-test"

Closes #85

See merge request sa4-2020/the-sanmarinoes/backend!192
2020-05-26 17:18:52 +02:00
omenem
55cea5aca2 solved NullPoinyer exception 2020-05-26 17:15:21 +02:00
f784796852 device controller is covered (yay) 2020-05-26 16:07:46 +02:00
Matteo Omenetti
3c4d295e44 Merge branch '91-fixxing-sonarqube-bugs' into 'dev'
fix

Closes #91

See merge request sa4-2020/the-sanmarinoes/backend!191
2020-05-26 15:43:51 +02:00
omenem
7eeab40ff9 fix 2020-05-26 15:40:22 +02:00
Matteo Omenetti
e006ff83d2 Merge branch '72-batch-3-implement-simulation-panel-routes-through-sensors' into 'dev'
Resolve "Batch 3: Implement simulation panel routes through sensors"

Closes #72

See merge request sa4-2020/the-sanmarinoes/backend!190
2020-05-26 13:00:13 +02:00
omenem
77e7e9bd7b wip 2020-05-26 12:52:44 +02:00
omenem
5f12c0c813 wip 2020-05-26 12:07:36 +02:00
omenem
0046143d82 wip 2020-05-26 12:05:42 +02:00
omenem
689e3b96a7 implemented user story 1 for thermmostat, a test is not passing 2020-05-26 11:40:58 +02:00
omenem
03ded14ed2 fix (wip) 2020-05-26 11:24:48 +02:00
7d974f1a1d device controller is almost tested (can't fix exception throw) 2020-05-25 21:32:10 +02:00
omenem
2f05253bc1 implemented user story 1 for sensor 2020-05-25 18:41:30 +02:00
omenem
82d111613f wip 2020-05-25 17:48:19 +02:00
Jacob Salvi
99c33cdfa5 Merge branch '90-dimmablestatecontroller-tests' of lab.si.usi.ch:sa4-2020/the-sanmarinoes/backend into 90-dimmablestatecontroller-tests 2020-05-25 17:35:25 +02:00
Jacob Salvi
4970791792 added MotionSensorService tests 2020-05-25 17:31:48 +02:00
Jacob Salvi
cffeeca9f8 added DevicePopulationServiceTests 2020-05-25 16:47:06 +02:00
Jacob Salvi
e7def27d22 added ThermostatPopulationServiceTests 2020-05-25 16:30:31 +02:00
Jacob Salvi
82900b1d02 added AutomationServiceTests 2020-05-25 16:19:27 +02:00
Jacob Salvi
a4ca37e6ec added SwitchableStateControllerTests 2020-05-25 15:55:39 +02:00
Jacob Salvi
4250f07fef added DimmableStateControllerTests 2020-05-25 15:47:19 +02:00
Matteo Omenetti
691130ada7 Merge branch '89-additional-tests' into 'dev'
Resolve "additional tests"

Closes #89

See merge request sa4-2020/the-sanmarinoes/backend!189
2020-05-25 14:59:05 +02:00
omenem
66422158f6 regular light controller 2020-05-25 14:56:09 +02:00
omenem
7cdbb19126 scene priority 2020-05-25 14:37:20 +02:00
omenem
c1a1994192 state 2020-05-25 14:34:33 +02:00
britea
9616638245 motion sensor tests 2020-05-25 14:23:23 +02:00
omenem
a3b606088c dimmable state 2020-05-25 14:06:49 +02:00
af93063cf4 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!187
2020-05-25 12:13:46 +02:00
Claudio Maggioni (maggicl)
9e98670ce9 Tests 2020-05-25 12:13:32 +02:00
b49839cbdb Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!186
2020-05-25 11:57:16 +02:00
Claudio Maggioni (maggicl)
ef2247e38a Tests 2020-05-25 11:57:01 +02:00
Matteo Omenetti
2e626b1f4d Merge branch '87-missing-test-in-regularlightcontroller' into 'dev'
added missing tests

Closes #87

See merge request sa4-2020/the-sanmarinoes/backend!184
2020-05-25 11:37:13 +02:00
eb9f5bc69f Merge branch '82-smartPlug-controller' into 'dev'
added RangeTriggerControllerTests

Closes #82

See merge request sa4-2020/the-sanmarinoes/backend!185
2020-05-25 11:34:49 +02:00
omenem
3fec9ccd20 added missing tests 2020-05-25 11:33:35 +02:00
1be860b989 Merge branch 'tests' into 'dev'
Fixes

See merge request sa4-2020/the-sanmarinoes/backend!183
2020-05-25 11:27:50 +02:00
Claudio Maggioni (maggicl)
48942ee8c2 Fixes 2020-05-25 11:27:34 +02:00
Matteo Omenetti
4e9aa3f726 Merge branch '86-scenepriority-tests' into 'dev'
Resolve "ScenePriority Tests"

Closes #86

See merge request sa4-2020/the-sanmarinoes/backend!182
2020-05-25 11:24:02 +02:00
omenem
63c4981da7 added scenePriorityControllerTests 2020-05-25 11:20:52 +02:00
omenem
ea0361c384 added missing tests in scenePriority 2020-05-25 10:40:43 +02:00
fa7fe5e8be Merge branch 'tests' into 'dev'
Fixes

See merge request sa4-2020/the-sanmarinoes/backend!181
2020-05-25 00:14:29 +02:00
Claudio Maggioni (maggicl)
00f2442397 Fixes 2020-05-25 00:14:14 +02:00
2a0abd41d5 Merge branch 'tests' into 'dev'
Fixes

See merge request sa4-2020/the-sanmarinoes/backend!180
2020-05-24 23:43:14 +02:00
Claudio Maggioni (maggicl)
710c7666dd Fixes 2020-05-24 23:42:47 +02:00
ed4219635a Merge branch 'tests' into 'dev'
Fixes

See merge request sa4-2020/the-sanmarinoes/backend!179
2020-05-24 23:10:49 +02:00
Claudio Maggioni (maggicl)
fe45151dd1 Fixes 2020-05-24 23:10:16 +02:00
Jacob Salvi
b3f24b7df3 added RangeTriggerControllerTests 2020-05-24 22:50:16 +02:00
2372d51efc Merge branch '83-dimmablelightcontrollertests' into 'dev'
Resolve "DimmableLightControllerTests"

Closes #83

See merge request sa4-2020/the-sanmarinoes/backend!178
2020-05-24 22:42:24 +02:00
12c65ed12f Merge branch '80-regularlightcontroller-tests' into 'dev'
Resolve "RegularLightController Tests"

Closes #80

See merge request sa4-2020/the-sanmarinoes/backend!176
2020-05-24 22:37:52 +02:00
Claudio Maggioni (maggicl)
f00850edd9 Fixes 2020-05-24 22:31:32 +02:00
00b4d77f76 Merge branch '82-smartPlug-controller' into 'dev'
Resolve "securityCameraControllerTests"

Closes #82

See merge request sa4-2020/the-sanmarinoes/backend!177
2020-05-24 22:29:22 +02:00
Claudio Maggioni (maggicl)
4253e65241 Fixes 2020-05-24 22:27:00 +02:00
Jacob Salvi
7b05718286 added ThermostatConditionControllerTests 2020-05-24 22:23:07 +02:00
Claudio Maggioni (maggicl)
ff51edc112 Merge branch '80-regularlightcontroller-tests' of lab.si.usi.ch:sa4-2020/the-sanmarinoes/backend into 80-regularlightcontroller-tests 2020-05-24 22:20:38 +02:00
Jacob Salvi
d25bcf3507 added RangeConditionControllerTests 2020-05-24 18:11:22 +02:00
Jacob Salvi
86ca38cd47 added a couple of tests to smartPlugControllerTests 2020-05-24 17:42:53 +02:00
omenem
d57a218fc9 WIP 2020-05-24 15:04:17 +02:00
omenem
bb9ccd2d6d WIP 2020-05-24 15:01:23 +02:00
omenem
ea8ac95b7a WIP 2020-05-24 14:55:59 +02:00
omenem
7652610c5d I can't mock a method 2020-05-24 14:16:07 +02:00
7d06c5d886 Merge branch 'tests' into 'dev'
Code smells fix

See merge request sa4-2020/the-sanmarinoes/backend!175
2020-05-24 12:32:16 +02:00
Claudio Maggioni (maggicl)
838aaf93ee Code smells fix 2020-05-24 12:31:39 +02:00
784574086b Merge branch 'tests' into 'dev'
Code smells fix

See merge request sa4-2020/the-sanmarinoes/backend!174
2020-05-24 12:18:53 +02:00
Claudio Maggioni (maggicl)
2f9585bd20 Code smells fix 2020-05-24 12:18:28 +02:00
f3b0f65499 Merge branch 'tests' into 'dev'
Code smells fix

See merge request sa4-2020/the-sanmarinoes/backend!173
2020-05-23 23:40:38 +02:00
Claudio Maggioni (maggicl)
d63ec73127 Code smells fix 2020-05-23 23:40:01 +02:00
004ee4ff18 Merge branch 'tests' into 'dev'
Code smells fix

See merge request sa4-2020/the-sanmarinoes/backend!172
2020-05-23 23:30:25 +02:00
Claudio Maggioni (maggicl)
3fc5d9bfcb Code smells fix 2020-05-23 23:29:49 +02:00
3cfe4cb1e8 Merge branch 'tests' into 'dev'
Code smells fix

See merge request sa4-2020/the-sanmarinoes/backend!171
2020-05-23 23:23:43 +02:00
Claudio Maggioni (maggicl)
79df130868 Code smells fix 2020-05-23 23:23:24 +02:00
e7d69457e4 Merge branch '82-securitycameracontrollertests' into 'dev'
Resolve "securityCameraControllerTests"

See merge request sa4-2020/the-sanmarinoes/backend!170
2020-05-23 22:51:34 +02:00
Jacob Salvi
6dedf59332 added a couple of tests to guestcontrollertests 2020-05-23 19:46:35 +02:00
b0662800f8 Merge branch 'tests' into 'dev'
Some tests on SceneServiceTests

See merge request sa4-2020/the-sanmarinoes/backend!169
2020-05-23 19:09:14 +02:00
Claudio Maggioni (maggicl)
5308ddec6f Some tests on SceneServiceTests 2020-05-23 19:08:40 +02:00
Jacob Salvi
5dd4dfec2c test for curtains controller 2020-05-23 18:45:57 +02:00
c84cc3ef42 Merge branch 'tests' into 'dev'
Tests on AuthenticationController

See merge request sa4-2020/the-sanmarinoes/backend!168
2020-05-23 18:36:49 +02:00
Claudio Maggioni (maggicl)
2f9bdd4a59 Tests on AuthenticationController 2020-05-23 18:36:35 +02:00
Jacob Salvi
608e1eda04 Merge remote-tracking branch 'origin/82-securitycameracontrollertests' into 82-securitycameracontrollertests 2020-05-23 18:24:48 +02:00
Jacob Salvi
cae11d44ad test for security camera 2020-05-23 18:20:34 +02:00
1dc37cca4b Merge branch '81-guestcontroller-test' into 'dev'
Resolve "GuestController test"

Closes #81

See merge request sa4-2020/the-sanmarinoes/backend!161
2020-05-23 17:54:49 +02:00
Claudio Maggioni (maggicl)
6abedac3cc It wasn't, but now it is 2020-05-23 17:50:39 +02:00
1f1eaf20db Merge branch 'tests' into 'dev'
Tests on SceneController

See merge request sa4-2020/the-sanmarinoes/backend!167
2020-05-23 15:58:30 +02:00
Claudio Maggioni (maggicl)
a8c76c03e0 Tests on SceneController 2020-05-23 15:58:09 +02:00
a8a4c47ff4 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!166
2020-05-23 15:19:16 +02:00
Claudio Maggioni (maggicl)
733b4639fa Tests on ThermostatService 2020-05-23 15:18:48 +02:00
Claudio Maggioni (maggicl)
84767b1793 Tests on UserAccountController 2020-05-23 14:53:10 +02:00
5c2ee4c55f assertion error should be fixed 2020-05-22 14:44:59 +02:00
b1343bbd40 trying to fix nullpointerexception 2020-05-22 14:35:36 +02:00
64007d1b5c tests done so far should be fixed 2020-05-22 14:29:17 +02:00
67b2c3ae4f findguests should be tested and imports should be fixed 2020-05-22 13:23:14 +02:00
420fed7f88 findall and findhosts should be tested in guestcontroller 2020-05-22 13:18:30 +02:00
2450a11b6e Merge branch '79-input-device-connection-controller-tests' into 'dev'
Resolve "Input device connection controller tests"

See merge request sa4-2020/the-sanmarinoes/backend!164
2020-05-21 23:35:07 +02:00
7161760f1f Merge branch 'tests' into 'dev'
Started tests on UserAccountController

See merge request sa4-2020/the-sanmarinoes/backend!163
2020-05-21 23:33:03 +02:00
Claudio Maggioni (maggicl)
37af69c7a7 Started tests on UserAccountController 2020-05-21 23:32:48 +02:00
0ec649607e Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!162
2020-05-21 22:04:02 +02:00
Claudio Maggioni (maggicl)
1a289f6800 Fixed some code smells 2020-05-21 22:03:38 +02:00
Claudio Maggioni (maggicl)
58a8b939fa Finished tests on DevicePropagationService 2020-05-21 21:46:29 +02:00
Jacob Salvi
859a9fb53e made 3 tests 2020-05-21 20:53:36 +02:00
Jacob Salvi
2f52be137f it took me a lot of time but i managed to make to KnobDimmer tests,
now that I kinda understand mockito the next tests should take considerably
less time
2020-05-21 15:47:13 +02:00
Matteo Omenetti
7a8524c15e Merge branch '78-thermostatcontrollertest' into 'dev'
Test for ThermostatController

Closes #78

See merge request sa4-2020/the-sanmarinoes/backend!160
2020-05-21 11:13:21 +02:00
omenem
7519212ddc Test for ThermostatController 2020-05-21 11:10:12 +02:00
ec0abbbe18 Merge branch 'tests' into 'dev'
Some tests on DevicePropagationService

See merge request sa4-2020/the-sanmarinoes/backend!159
2020-05-20 16:40:03 +02:00
Claudio Maggioni (maggicl)
ae10998c98 Some tests on DevicePropagationService 2020-05-20 16:39:44 +02:00
d2fe693bfc Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!158
2020-05-20 11:50:19 +02:00
Claudio Maggioni (maggicl)
5c90428fca done SensorSocketEndpointTests 2020-05-20 11:49:54 +02:00
Claudio Maggioni (maggicl)
f534665bdb WIP on SensorSocketEndpointTests 2020-05-20 11:35:25 +02:00
Claudio Maggioni (maggicl)
03bd220781 WIP on SensorSocketEndpointTests 2020-05-20 11:10:05 +02:00
6f43b6289f Merge branch 'tests' into 'dev'
Tested Automation FastUpdate

See merge request sa4-2020/the-sanmarinoes/backend!157
2020-05-20 10:14:42 +02:00
Claudio Maggioni (maggicl)
4b96820d36 Tested Automation FastUpdate 2020-05-20 10:14:17 +02:00
9f03f75bcb Merge branch 'tests' into 'dev'
Reorganized tests

See merge request sa4-2020/the-sanmarinoes/backend!156
2020-05-19 19:39:25 +02:00
Claudio Maggioni (maggicl)
c2ecf0d0dc Reorganized tests 2020-05-19 19:38:33 +02:00
433852b6bb Merge branch 'tests' into 'dev'
Some tests on DevicePropagationService

See merge request sa4-2020/the-sanmarinoes/backend!155
2020-05-19 19:18:20 +02:00
Claudio Maggioni (maggicl)
7f1655a0fe Some tests on DevicePropagationService 2020-05-19 19:13:51 +02:00
f802440d3a Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!154
2020-05-19 18:41:46 +02:00
Claudio Maggioni (maggicl)
6b3886ccb1 Added basic tests to SmartPlugController 2020-05-19 18:38:31 +02:00
Claudio Maggioni (maggicl)
76e5bed119 Added basic tests to SceneController 2020-05-19 18:06:48 +02:00
a0a0320c84 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!153
2020-05-19 17:34:29 +02:00
Claudio Maggioni (maggicl)
fc6c1e7492 Added basic tests to RoomController 2020-05-19 17:34:12 +02:00
Claudio Maggioni (maggicl)
294cdc9a5d Added basic tests to AutomationController 2020-05-19 17:12:16 +02:00
Matteo Omenetti
32aa0575eb Merge branch '77-fix-in-inheritance-type-of-conditions' into 'dev'
fix

Closes #77

See merge request sa4-2020/the-sanmarinoes/backend!152
2020-05-19 16:00:51 +02:00
omenem
77e9b1f0c6 fix 2020-05-19 15:52:03 +02:00
90ec64469b Merge branch 'tests' into 'dev'
Added DeviceService tests possibly breaking everything

See merge request sa4-2020/the-sanmarinoes/backend!150
2020-05-19 14:38:52 +02:00
Claudio Maggioni (maggicl)
016c9f563e Added DeviceService tests possibly breaking everything 2020-05-19 14:35:51 +02:00
c0da4c6f57 Merge branch 'tests' into 'dev'
fixed stuff

See merge request sa4-2020/the-sanmarinoes/backend!149
2020-05-18 17:59:56 +02:00
4fde95231b fixed stuff 2020-05-18 17:58:38 +02:00
c2686f2f24 Merge branch 'tests' into 'dev'
More tests

See merge request sa4-2020/the-sanmarinoes/backend!148
2020-05-18 13:16:59 +02:00
Claudio Maggioni (maggicl)
0b1ff0f71e More tests 2020-05-18 13:16:34 +02:00
08565bbc42 Merge branch 'tests' into 'dev'
Tests

See merge request sa4-2020/the-sanmarinoes/backend!147
2020-05-18 12:20:59 +02:00
Claudio Maggioni (maggicl)
319206334e Partial tests on DeviceService 2020-05-18 12:20:34 +02:00
b34ba85cb7 Merge branch '75-backend-unit-testing' into 'dev'
a couple of tests

Closes #75

See merge request sa4-2020/the-sanmarinoes/backend!146
2020-05-18 12:02:21 +02:00
Jacob Salvi
266fc3af9e fixed sensorsaverequest 2020-05-18 11:58:33 +02:00
Claudio Maggioni (maggicl)
be5ab5b4b3 Fixed lombok 2020-05-18 11:54:08 +02:00
Claudio Maggioni (maggicl)
0ce873dc52 Working on DeviceService tests 2020-05-18 10:52:58 +02:00
Jacob Salvi
0151467b2e Merge branch 'dev' into '75-backend-unit-testing'
# Conflicts:
#   src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/UserResponseTests.java
2020-05-17 15:28:14 +02:00
Jacob Salvi
00452d5295 made a couple of tests 2020-05-17 15:20:14 +02:00
6da0800455 Merge branch 'tests' into 'dev'
Tests on Utils and UserResponse

See merge request sa4-2020/the-sanmarinoes/backend!145
2020-05-17 14:00:26 +02:00
Claudio Maggioni (maggicl)
eeec726966 Tests on Utils and UserResponse 2020-05-17 13:56:54 +02:00
590e675811 Merge branch 'tests' into 'dev'
Tests on exception classes

See merge request sa4-2020/the-sanmarinoes/backend!144
2020-05-17 13:30:01 +02:00
Claudio Maggioni (maggicl)
4e35aa4a75 Tests on exception classes 2020-05-17 13:26:51 +02:00
7b606307df Merge branch '75-backend-unit-testing-tommaso' into 'dev'
Resolve "backend-unit-testing"

Closes #75

See merge request sa4-2020/the-sanmarinoes/backend!143
2020-05-17 12:52:37 +02:00
Claudio Maggioni (maggicl)
bc7b30f3ea Fixed lombok in AutomationFastUpdateRequest 2020-05-17 12:49:40 +02:00
fdef45b8c2 Merge branch '75-backend-unit-testing' into 'dev'
Resolve "backend-unit-testing"

Closes #75

See merge request sa4-2020/the-sanmarinoes/backend!142
2020-05-17 12:34:58 +02:00
Matteo Omenetti
18e5f74b90 Merge branch '75-backend-unit-testing-matteo' into 'dev'
Resolve "backend-unit-testing"

Closes #75

See merge request sa4-2020/the-sanmarinoes/backend!141
2020-05-17 11:56:14 +02:00
omenem
c5b3a57faa fix 2020-05-17 11:52:37 +02:00
omenem
940c072711 fix 2020-05-17 11:33:30 +02:00
omenem
0ce6e84380 fix 2020-05-17 11:26:49 +02:00
omenem
5946d0974e fix 2020-05-17 11:16:51 +02:00
omenem
dd1d59a095 fix 2020-05-17 11:13:50 +02:00
Matteo Omenetti
5f692db5f7 Merge branch 'dev' into '75-backend-unit-testing-matteo'
# Conflicts:
#   src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java
2020-05-17 10:20:16 +02:00
omenem
198be1f668 more tests 2020-05-17 10:16:12 +02:00
omenem
3f568c77d3 more tests 2020-05-16 18:00:28 +02:00
omenem
7020f0d692 fix 2020-05-15 19:01:28 +02:00
omenem
3d9ddb5ffd some tests 2020-05-15 18:52:57 +02:00
3dcfa584f0 made some fields private 2020-05-14 21:02:49 +02:00
368530de97 automation dto should be tested 2020-05-14 19:00:07 +02:00
0031fe38ea Merge branch 'controller-tests' into 'dev'
Added example tests for SensorController

See merge request sa4-2020/the-sanmarinoes/backend!140
2020-05-13 12:14:20 +02:00
Claudio Maggioni (maggicl)
3ed6102b9f Added example tests for SensorController 2020-05-13 12:10:06 +02:00
Jacob Salvi
b4bf15583a a couple of tests 2020-05-13 09:42:36 +02:00
ba9001a9c8 Merge branch 'sonar-fix' into 'dev'
Degenerified states

See merge request sa4-2020/the-sanmarinoes/backend!139
2020-05-12 18:37:08 +02:00
acec5a0af8 Degenerified states 2020-05-12 18:32:23 +02:00
c9fbffea7a Merge branch 'sonar-fix' into 'dev'
Removed @NotNull from models

See merge request sa4-2020/the-sanmarinoes/backend!138
2020-05-12 17:23:07 +02:00
6223434979 Removed duplication 2020-05-12 17:20:19 +02:00
0d10d759a6 Removed @NotNull from models 2020-05-12 17:14:25 +02:00
74270269ca Merge branch 'sonar-fix' into 'dev'
More lombok-ification

See merge request sa4-2020/the-sanmarinoes/backend!137
2020-05-12 17:02:59 +02:00
582f44581b More lombok-ification 2020-05-12 16:59:46 +02:00
328ad4e882 Merge branch 'sonar-fix' into 'dev'
Added lombok and converted DTOs

See merge request sa4-2020/the-sanmarinoes/backend!136
2020-05-12 15:49:54 +02:00
3bb008517a Merge branch 'dev' of lab.si.usi.ch:sa4-2020/the-sanmarinoes/backend into sonar-fix 2020-05-12 15:46:23 +02:00
87df96760d Added lombok and converted DTOs 2020-05-12 15:44:32 +02:00
Jacob Salvi
c614f96b31 Merge remote-tracking branch 'origin/dev' into dev 2020-05-10 21:54:18 +02:00
6e207a34c9 Merge branch 'sonar-fix' into 'dev'
Degenerified Conditions

See merge request sa4-2020/the-sanmarinoes/backend!135
2020-05-10 21:49:14 +02:00
Claudio Maggioni (maggicl)
c6041e0e0f Degenerified Conditions 2020-05-10 21:44:10 +02:00
c003bd1e87 Merge branch '55-users-can-add-conditions-to-automations' into 'dev'
Resolve "Users can add conditions to automations"

Closes #55

See merge request sa4-2020/the-sanmarinoes/backend!133
2020-05-10 21:30:39 +02:00
Claudio Maggioni (maggicl)
0ba0d10cdc Merge branch 'dev' of lab.si.usi.ch:sa4-2020/the-sanmarinoes/backend into 55-users-can-add-conditions-to-automations 2020-05-10 21:26:42 +02:00
d0fa87e9c3 Merge branch 'sonar-fix' into 'dev'
Even another batch of sonar fixes

See merge request sa4-2020/the-sanmarinoes/backend!134
2020-05-10 20:50:22 +02:00
Claudio Maggioni (maggicl)
5e1b07d32f Even another batch of sonar fixes 2020-05-10 20:47:18 +02:00
Jacob Salvi
1b22534f40 room and thermostat tests 2020-05-10 15:17:27 +02:00
fe7e004494 Merge branch 'sonar-fix' into 'dev'
Even another batch of sonar fixes

See merge request sa4-2020/the-sanmarinoes/backend!132
2020-05-10 12:51:23 +02:00
Claudio Maggioni (maggicl)
573a5c6a91 Fixing confirmationTokenRepository and deleted generic parameter on children of trigger 2020-05-10 12:48:41 +02:00
Claudio Maggioni (maggicl)
b64979500b Even another batch of sonar fixes 2020-05-10 12:39:18 +02:00
2976212f18 Merge branch 'sonar-fix' into 'dev'
Even another batch of sonar fixes

See merge request sa4-2020/the-sanmarinoes/backend!131
2020-05-10 12:13:28 +02:00
Claudio Maggioni (maggicl)
9394a8439f Even another batch of sonar fixes 2020-05-10 12:09:53 +02:00
Jacob Salvi
1d422ec420 Merge remote-tracking branch 'origin/dev' into dev 2020-05-10 10:34:46 +02:00
4b10466f1a Merge branch 'sonar-fix' into 'dev'
Even another batch of sonar fixes

See merge request sa4-2020/the-sanmarinoes/backend!130
2020-05-10 00:41:06 +02:00
Claudio Maggioni (maggicl)
483a42b1e0 Even another batch of sonar fixes 2020-05-10 00:38:13 +02:00
5cbbbfed31 Merge branch 'sonar-fix' into 'dev'
Sonarqube fixes to tests

See merge request sa4-2020/the-sanmarinoes/backend!129
2020-05-09 19:21:31 +02:00
5d4aea2e56 Sonarqube fixes to tests 2020-05-09 19:16:23 +02:00
1e99f5a501 Merge branch 'sonar-fix' into 'dev'
Sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!128
2020-05-09 17:54:25 +02:00
bd47a571d5 Sonarqube fixes 2020-05-09 17:53:58 +02:00
d39424c623 Merge branch 'sonar-fix' into 'dev'
Sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!127
2020-05-09 17:44:59 +02:00
b4ded92695 Sonarqube fixes 2020-05-09 17:44:38 +02:00
omenem
a24b30ce19 fix in automation repo 2020-05-09 16:55:47 +02:00
b3b701b612 Merge branch 'sonar-fix' into 'dev'
Fixed circular dependency on switch connector

See merge request sa4-2020/the-sanmarinoes/backend!126
2020-05-09 14:24:00 +02:00
Claudio Maggioni (maggicl)
15faf0a6b4 Fixed circular dependency on switch connector 2020-05-09 14:23:39 +02:00
62d2c8d027 Merge branch 'sonar-fix' into 'dev'
More sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!125
2020-05-09 14:06:01 +02:00
Claudio Maggioni (maggicl)
191870d3c6 More sonarqube fixes 2020-05-09 14:05:43 +02:00
6fce31d1bf Merge branch 'sonar-fix' into 'dev'
Minor code style fixes and global formatter run

See merge request sa4-2020/the-sanmarinoes/backend!124
2020-05-09 13:42:35 +02:00
Claudio Maggioni (maggicl)
6e98972a5b Minor code style fixes and global formatter run 2020-05-09 13:42:17 +02:00
bc82532691 Merge branch 'sonar-fix' into 'dev'
Even more Sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!123
2020-05-09 13:29:22 +02:00
Claudio Maggioni (maggicl)
204f7bf423 Even more Sonarqube fixes 2020-05-09 13:29:03 +02:00
7ab70976c9 Merge branch 'sonar-fix' into 'dev'
Fixed very severe security vulnerability (Use logger instead of System.out in SensorSocketEndpoint)

See merge request sa4-2020/the-sanmarinoes/backend!122
2020-05-09 13:18:50 +02:00
Claudio Maggioni (maggicl)
ba02475c83 Fixed very severe security vulnerability (Use logger instead of System.out in SensorSocketEndpoint) 2020-05-09 13:18:33 +02:00
f7927887b8 Merge branch 'sonar-fix' into 'dev'
more Sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!121
2020-05-09 13:13:53 +02:00
Claudio Maggioni (maggicl)
bd32a2aebb more Sonarqube fixes 2020-05-09 13:13:31 +02:00
Jacob Salvi
5bfb7888c2 Merge remote-tracking branch 'origin/dev' into dev 2020-05-09 11:11:11 +02:00
774bbc5ab9 Merge branch 'sonar-fix' into 'dev'
Sonarqube fixes

See merge request sa4-2020/the-sanmarinoes/backend!120
2020-05-08 23:18:45 +02:00
Claudio Maggioni (maggicl)
a61e43a014 Sonarqube fixes 2020-05-08 23:18:18 +02:00
omenem
628edfd76f edited GSONConfig 2020-05-08 17:50:59 +02:00
omenem
b72f527b0d Added conditions in PUT automation/fast 2020-05-08 17:44:30 +02:00
b2f4805ef3 Merge branch '74-thermostat-fix' into 'dev'
Resolve "thermostat-fix"

Closes #74

See merge request sa4-2020/the-sanmarinoes/backend!119
2020-05-08 16:10:13 +02:00
Jacob Salvi
d4a0f195ad Merge remote-tracking branch 'origin/dev' into dev 2020-05-08 14:58:32 +02:00
britea
501b9219b9 resolve conflict 2020-05-08 10:03:31 +02:00
britea
c9f53f0c97 fix thermostat 2020-05-08 09:59:42 +02:00
omenem
09c08580ca Everything should be implemented 2020-05-07 19:01:35 +02:00
omenem
1bde4344be Added controllers repos and dtos 2020-05-07 18:12:55 +02:00
omenem
1f5f948e23 wip 2020-05-07 16:38:45 +02:00
Luca Ponzanelli
7c1d010805 Merge branch '73-setup-sonarqube-pipeline-for-development-branch' into 'dev'
Resolve "Setup SonarQube pipeline for development branch"

Closes #73

See merge request sa4-2020/the-sanmarinoes/backend!117
2020-05-07 13:52:34 +02:00
Luca Ponzanelli
317ddb5445 Issue #73: fix CI_PROJECT_PATH_SLUG env variable name 2020-05-07 13:49:32 +02:00
Luca Ponzanelli
b5def1b50d Merge branch '73-setup-sonarqube-pipeline-for-development-branch' into 'dev'
Resolve "Setup SonarQube pipeline for development branch"

Closes #73

See merge request sa4-2020/the-sanmarinoes/backend!116
2020-05-07 13:39:09 +02:00
Luca Ponzanelli
028983072d Resolve "Setup SonarQube pipeline for development branch"
- Remove de.aaschmid.cpd, and sonarqube v2.7 gradle plugins
 - Add sonarqube and jacopo gradle plugins
 - Remove code_quality job and add sonarqube job in code_quality stage
 - Limit sonarqube analysis to dev branch only
2020-05-07 13:39:08 +02:00
5a31f4cf98 Merge branch 'sonar-test' into 'dev'
on error fixing for sonarqube code smells and vulnerabilities check

See merge request sa4-2020/the-sanmarinoes/backend!115
2020-05-07 10:39:18 +02:00
Claudio Maggioni (maggicl)
c8ebd8f917 WIP on error fixing for sonarqube code smells and vulnerabilities check 2020-05-07 10:33:20 +02:00
omenem
74364effe6 wip 2020-05-07 10:04:05 +02:00
omenem
6060e627dd wip 2020-05-07 10:01:51 +02:00
3f6dd4c02c Merge branch 'mailmap-fix' into 'dev'
Added updated mailmap for everyone in the repo

See merge request sa4-2020/the-sanmarinoes/backend!114
2020-05-06 12:11:11 +02:00
Claudio Maggioni (maggicl)
29d1022700 Added updated mailmap for everyone in the repo 2020-05-06 12:10:45 +02:00
5649ca9c29 Merge branch 'scene-guest-fix' into 'dev'
Scene guest fix

See merge request sa4-2020/the-sanmarinoes/backend!113
2020-05-05 16:36:16 +02:00
ddcdaccbe0 Check Scene.guestAccessEnabled flag on guest application of scene 2020-05-05 16:31:54 +02:00
Jacob Salvi
912d81e84f Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatController.java
2020-05-05 14:24:03 +02:00
38c703e521 Merge branch '69-7-fixes-to-guest-user-story' into 'dev'
Resolve "7: fixes to guest user story"

Closes #69

See merge request sa4-2020/the-sanmarinoes/backend!112
2020-05-04 17:15:29 +02:00
Claudio Maggioni (maggicl)
a278a9f7b3 Reviewed GET /scene?hostId= and GET /scene/{sceneId}/apply?hostId= 2020-05-04 17:11:59 +02:00
Claudio Maggioni (maggicl)
c24598cc6a Done security camera filtering if required by host 2020-05-04 16:35:46 +02:00
1ddc8f5ba6 Merge branch '71-when-creating-a-scene-users-can-t-copy-the-configuration-from-another-scene' into 'dev'
Resolve "When creating a scene, users can't copy the configuration from another scene."

Closes #71

See merge request sa4-2020/the-sanmarinoes/backend!111
2020-05-04 16:14:22 +02:00
Claudio Maggioni (maggicl)
16d1af2b36 Scene copy implemented 2020-05-04 16:10:17 +02:00
297fe5f9b3 Merge branch '70-scene-has-not-a-customizable-icon' into 'dev'
Resolve "scene has not a customizable icon"

Closes #70

See merge request sa4-2020/the-sanmarinoes/backend!110
2020-05-04 15:12:46 +02:00
Claudio Maggioni (maggicl)
5bfce7e99b Added icons to scenes 2020-05-04 15:09:11 +02:00
cb2713afa5 Merge branch 'guests-fix' into 'dev'
Guests fix

See merge request sa4-2020/the-sanmarinoes/backend!109
2020-05-04 12:02:39 +02:00
Claudio Maggioni (maggicl)
21bc66d24b Deletion propagation implemented 2020-05-04 11:58:03 +02:00
Claudio Maggioni (maggicl)
69d1b38ff2 other minor fixes^2 2020-05-03 19:50:00 +02:00
Claudio Maggioni (maggicl)
4a963115bb Merge branch 'dev' of lab.si.usi.ch:sa4-2020/the-sanmarinoes/backend into guests-fix 2020-05-03 16:38:27 +02:00
01541a843e Merge branch '68-thermostat-updates-on-sensor-only-are-not-sent' into 'dev'
Resolve "Thermostat updates on sensor only are not sent"

Closes #68

See merge request sa4-2020/the-sanmarinoes/backend!108
2020-05-03 14:25:29 +02:00
Claudio Maggioni (maggicl)
aad6cc52ce Fixed thermostat socket updates 2020-05-03 14:14:24 +02:00
Claudio Maggioni (maggicl)
25eb9555c0 Fixed for frontend to guest controllers 2020-05-02 22:37:54 +02:00
6263bd2d35 WIP 2020-05-02 20:50:50 +02:00
Claudio Maggioni (maggicl)
92e93c80e8 WIP 2020-05-02 16:41:11 +02:00
e8a3480add Merge branch 'automations-fix-2' into 'dev'
Fixed propagation of device updates on automation scene application

See merge request sa4-2020/the-sanmarinoes/backend!107
2020-05-02 14:57:13 +02:00
Claudio Maggioni (maggicl)
7ae7522359 Fixed propagation of device updates on automation scene application 2020-05-02 14:53:12 +02:00
50508d95be Merge branch 'thermostat-fix' into 'dev'
Thermostats fixed (for scenes)

See merge request sa4-2020/the-sanmarinoes/backend!106
2020-05-02 14:02:33 +02:00
Claudio Maggioni (maggicl)
c3d6590507 Thermostats fixed (for scenes) 2020-05-02 13:58:28 +02:00
36dbb0dac9 Merge branch 'thermostat-fix' into 'dev'
Thermostats fixed

See merge request sa4-2020/the-sanmarinoes/backend!105
2020-05-02 11:16:39 +02:00
Claudio Maggioni (maggicl)
e0ab831be9 Thermostats fixed 2020-05-02 11:12:11 +02:00
a7e26aee98 Merge branch 'automations-fix-1' into 'dev'
Fixed GSON serializations of triggers

See merge request sa4-2020/the-sanmarinoes/backend!104
2020-05-01 20:09:43 +02:00
Claudio Maggioni (maggicl)
3d74e02434 Fixed GSON serializations of triggers 2020-05-01 20:04:44 +02:00
74fee11814 Merge branch 'fix' into 'dev'
fix

See merge request sa4-2020/the-sanmarinoes/backend!102
2020-04-28 10:48:31 +02:00
Claudio Maggioni (maggicl)
cfa2f794cb fix 2020-04-28 10:48:09 +02:00
f7f7d3a2a9 Merge branch 'fix' into 'dev'
fixz

See merge request sa4-2020/the-sanmarinoes/backend!100
2020-04-28 10:05:34 +02:00
Claudio Maggioni (maggicl)
ba73348a74 fixz 2020-04-28 10:05:08 +02:00
Jacob Salvi
36c921320b Merge remote-tracking branch 'origin/dev' into dev 2020-04-28 08:27:51 +02:00
Jacob Salvi
57fdb8eacd Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Thermostat.java
2020-04-27 17:58:20 +02:00
Jacob Salvi
e3d7908537 Merge remote-tracking branch 'origin/dev' into dev 2020-04-26 13:32:35 +02:00
Jacob Salvi
886f43bf62 small fix to thermostat controller 2020-04-25 14:38:47 +02:00
242 changed files with 9737 additions and 2296 deletions

View File

@ -52,14 +52,10 @@ test:
reports:
junit: build/test-results/test/TEST-*.xml
#Runs a quality check on the code and creates a report on the codes
code_quality:
sonarqube:
image: gradle:jdk11
stage: code_quality
allow_failure: true
only:
- dev
script:
- gradle cpdCheck
artifacts:
paths:
- build/reports/cpd/cpdCheck.xml
#create a report on the quality of the code
expose_as: 'Code Quality Report'
- gradle build jacocoTestReport sonarqube -Dsonar.verbose=true -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_LOGIN -Dsonar.projectKey=$CI_PROJECT_PATH_SLUG -Dsonar.projectName=$CI_PROJECT_PATH_SLUG -Dsonar.scm.disabled=True -Dsonar.coverage.jacoco.xmlReportPaths=./build/reports/jacoco/test/jacocoTestReport.xml

8
.mailmap Normal file
View File

@ -0,0 +1,8 @@
Claudio Maggioni <maggicl@usi.ch> Claudio Maggioni (maggicl) <maggicl@kolabnow.ch>
Claudio Maggioni <maggicl@usi.ch> Claudio Maggioni (maggicl) <maggicl@usi.ch>
Filippo Cesana <cesanf@usi.ch> FilippoCesana <cesanf@usi.ch>
Filippo Cesana <cesanf@usi.ch> Fil Cesana <cesanf@usi.ch>
Andrea Brites Marto <britea@usi.ch> britea <andreabritesma@gmail.com>
Christian Capeáns Pérez <capeac@usi.ch> christiancp <capeac@usi.ch>
Tommaso Rodolfo Masera <rodolt@usi.ch> tommi27 <tommi99@hotmail.it>
Matteo Omenetti <omenem@usi.ch> omenem <omenem@usi.ch>

View File

@ -1,8 +1,10 @@
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id "de.aaschmid.cpd" version "3.1"
id 'java'
id 'jacoco'
id "org.sonarqube" version "2.8"
id 'io.freefair.lombok' version '5.0.1'
}
group = 'ch.usi.inf.sa4.sanmarinoes'
version = '0.0.1-SNAPSHOT'
@ -35,6 +37,7 @@ dependencies {
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'nl.jqno.equalsverifier:equalsverifier:3.3'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'com.h2database:h2:1.4.200'
// Fixes https://stackoverflow.com/a/60455550
@ -43,10 +46,20 @@ dependencies {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
options.compilerArgs << "-Xlint:deprecation"
}
}
test {
useJUnitPlatform()
}
}
jacocoTestReport {
reports {
xml.enabled true
}
}
plugins.withType(JacocoPlugin) {
tasks["test"].finalizedBy 'jacocoTestReport'
}

4
gradle.properties Normal file
View File

@ -0,0 +1,4 @@
systemProp.sonar.host.url=https://lab.si.usi.ch:9000
systemProp.sonar.login=871fdfcb09345b1841f1730596ac32aacf3a86fb
systemProp.sonar.projectKey=SMASmarthutBackend
systemProp.sonar.scm.disabled=true

3
lombok.config Normal file
View File

@ -0,0 +1,3 @@
# This file is generated by the 'io.freefair.lombok' Gradle plugin
config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true

View File

@ -14,7 +14,8 @@ import org.springframework.stereotype.Component;
public class CORSFilter implements Filter {
public static void setCORSHeaders(HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader(
new StringBuilder("nigirO-wollA-lortnoC-sseccA").reverse().toString(), "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
@ -31,10 +32,4 @@ public class CORSFilter implements Filter {
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}

View File

@ -0,0 +1,24 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.config;
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
@Component
@Validated
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "camera")
public class CameraConfigurationService {
@NotNull private String videoUrl;
public synchronized String getVideoUrl() {
return videoUrl;
}
public synchronized void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
}

View File

@ -46,67 +46,77 @@ public class EmailConfigurationService {
@NotNull private String registrationRedirect;
public String getRegistrationSubject() {
@NotNull private String from;
public synchronized String getRegistrationSubject() {
return registrationSubject;
}
public void setRegistrationSubject(String registrationSubject) {
public synchronized void setRegistrationSubject(String registrationSubject) {
this.registrationSubject = registrationSubject;
}
public String getRegistration() {
public synchronized String getRegistration() {
return registration;
}
public void setRegistration(String registration) {
public synchronized void setRegistration(String registration) {
this.registration = registration;
}
public String getRegistrationPath() {
public synchronized String getRegistrationPath() {
return registrationPath;
}
public void setRegistrationPath(String registrationPath) {
public synchronized void setRegistrationPath(String registrationPath) {
this.registrationPath = registrationPath;
}
public String getResetPasswordSubject() {
public synchronized String getResetPasswordSubject() {
return resetPasswordSubject;
}
public void setResetPasswordSubject(String resetPasswordSubject) {
public synchronized void setResetPasswordSubject(String resetPasswordSubject) {
this.resetPasswordSubject = resetPasswordSubject;
}
public String getResetPassword() {
public synchronized String getResetPassword() {
return resetPassword;
}
public void setResetPassword(String resetPassword) {
public synchronized void setResetPassword(String resetPassword) {
this.resetPassword = resetPassword;
}
public String getResetPasswordPath() {
public synchronized String getResetPasswordPath() {
return resetPasswordPath;
}
public void setResetPasswordPath(String resetPasswordPath) {
public synchronized void setResetPasswordPath(String resetPasswordPath) {
this.resetPasswordPath = resetPasswordPath;
}
public String getResetPasswordRedirect() {
public synchronized String getResetPasswordRedirect() {
return resetPasswordRedirect;
}
public void setResetPasswordRedirect(String resetPasswordRedirect) {
public synchronized void setResetPasswordRedirect(String resetPasswordRedirect) {
this.resetPasswordRedirect = resetPasswordRedirect;
}
public String getRegistrationRedirect() {
public synchronized String getRegistrationRedirect() {
return registrationRedirect;
}
public void setRegistrationRedirect(String registrationRedirect) {
public synchronized void setRegistrationRedirect(String registrationRedirect) {
this.registrationRedirect = registrationRedirect;
}
public synchronized String getFrom() {
return from;
}
public synchronized void setFrom(String from) {
this.from = from;
}
}

View File

@ -1,9 +1,7 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.config;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.AutomationFastUpdateRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableState;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.State;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableState;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import com.google.gson.*;
import java.lang.reflect.Type;
import org.springframework.context.annotation.Bean;
@ -27,22 +25,33 @@ public class GsonConfig {
private static GsonBuilder configureBuilder() {
final GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter());
@SuppressWarnings({"rawTypes"})
RuntimeTypeAdapterFactory<State> runtimeTypeAdapterFactory =
RuntimeTypeAdapterFactory.of(State.class, "kind")
.registerSubtype(SwitchableState.class, "switchableState")
.registerSubtype(DimmableState.class, "dimmableState");
RuntimeTypeAdapterFactory<AutomationFastUpdateRequest.TriggerDTO>
runtimeTypeAdapterFactoryII =
RuntimeTypeAdapterFactory.of(
AutomationFastUpdateRequest.TriggerDTO.class, "kind")
.registerSubtype(
AutomationFastUpdateRequest.BooleanTriggerDTO.class,
"booleanTrigger")
.registerSubtype(
AutomationFastUpdateRequest.RangeTriggerDTO.class,
"rangeTrigger");
RuntimeTypeAdapterFactory<TriggerDTO> runtimeTypeAdapterFactoryII =
RuntimeTypeAdapterFactory.of(TriggerDTO.class, "kind")
.registerSubtype(BooleanTriggerDTO.class, "booleanTrigger")
.registerSubtype(RangeTriggerDTO.class, "rangeTrigger");
RuntimeTypeAdapterFactory<ConditionDTO> runtimeTypeAdapterFactoryIII =
RuntimeTypeAdapterFactory.of(ConditionDTO.class, "kind")
.registerSubtype(BooleanConditionDTO.class, "booleanCondition")
.registerSubtype(RangeConditionDTO.class, "rangeCondition")
.registerSubtype(ThermostatConditionDTO.class, "thermostatCondition");
builder.registerTypeAdapterFactory(runtimeTypeAdapterFactory);
builder.registerTypeAdapterFactory(runtimeTypeAdapterFactoryII);
builder.registerTypeAdapterFactory(runtimeTypeAdapterFactoryIII);
builder.registerTypeAdapter(
Trigger.class,
(JsonSerializer<Trigger<?>>)
(src, typeOfSrc, context) -> context.serialize((Object) src));
builder.registerTypeAdapter(
Condition.class,
(JsonSerializer<Condition<?>>)
(src, typeOfSrc, context) -> context.serialize((Object) src));
return builder;
}

View File

@ -18,9 +18,15 @@ import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class JWTRequestFilter extends OncePerRequestFilter {
@Autowired private JWTUserDetailsService jwtUserDetailsService;
private final JWTUserDetailsService jwtUserDetailsService;
private final JWTTokenUtils jwtTokenUtils;
@Autowired private JWTTokenUtils jwtTokenUtils;
@Autowired
public JWTRequestFilter(
JWTUserDetailsService jwtUserDetailsService, JWTTokenUtils jwtTokenUtils) {
this.jwtUserDetailsService = jwtUserDetailsService;
this.jwtTokenUtils = jwtTokenUtils;
}
@Override
protected void doFilterInternal(
@ -36,9 +42,9 @@ public class JWTRequestFilter extends OncePerRequestFilter {
try {
username = jwtTokenUtils.getUsernameFromToken(jwtToken);
} catch (IllegalArgumentException e) {
System.out.println("Unable to get JWT Token");
logger.info("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
System.out.println("JWT Token has expired");
logger.info("JWT Token has expired");
}
} else {
logger.warn("JWT Token does not begin with Bearer String");

View File

@ -14,7 +14,7 @@ import org.springframework.stereotype.Component;
@Component
public class JWTTokenUtils {
/** The duration in seconds of the validity of a single token */
private static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60;
private static final long JWT_TOKEN_VALIDITY = (long) 5 * 60 * 60;
/** The secret key used to encrypt all JWTs */
@Value("${jwt.secret}")
@ -68,7 +68,7 @@ public class JWTTokenUtils {
* @param userDetails user details to validate against
* @return true if valid, false if not
*/
public Boolean validateToken(String token, UserDetails userDetails) {
public boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}

View File

@ -1,28 +1,6 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.config;
/*
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.*;
import com.google.gson.internal.Streams;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
@ -77,8 +55,8 @@ import java.util.Map;
* }
* }</pre>
*
* This class addresses this problem by adding type information to the serialized JSON and honoring
* that type information when the JSON is deserialized:
* <p>This class addresses this problem by adding type information to the serialized JSON and
* honoring that type information when the JSON is deserialized:
*
* <pre>{@code
* {
@ -98,12 +76,12 @@ import java.util.Map;
* }
* }</pre>
*
* Both the type field name ({@code "type"}) and the type labels ({@code "Rectangle"}) are
* <p>Both the type field name ({@code "type"}) and the type labels ({@code "Rectangle"}) are
* configurable.
*
* <h3>Registering Types</h3>
*
* Create a {@code RuntimeTypeAdapterFactory} by passing the base type and type field name to the
* <p>Create a {@code RuntimeTypeAdapterFactory} by passing the base type and type field name to the
* {@link #of} factory method. If you don't supply an explicit type field name, {@code "type"} will
* be used.
*
@ -112,7 +90,7 @@ import java.util.Map;
* = RuntimeTypeAdapterFactory.of(Shape.class, "type");
* }</pre>
*
* Next register all of your subtypes. Every subtype must be explicitly registered. This protects
* <p>Next register all of your subtypes. Every subtype must be explicitly registered. This protects
* your application from injection attacks. If you don't supply an explicit type label, the type's
* simple name will be used.
*
@ -122,7 +100,7 @@ import java.util.Map;
* shapeAdapterFactory.registerSubtype(Diamond.class, "Diamond");
* }</pre>
*
* Finally, register the type adapter factory in your application's GSON builder:
* <p>Finally, register the type adapter factory in your application's GSON builder:
*
* <pre>{@code
* Gson gson = new GsonBuilder()
@ -130,7 +108,7 @@ import java.util.Map;
* .create();
* }</pre>
*
* Like {@code GsonBuilder}, this API supports chaining:
* <p>Like {@code GsonBuilder}, this API supports chaining:
*
* <pre>{@code
* RuntimeTypeAdapterFactory<Shape> shapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class)
@ -141,7 +119,7 @@ import java.util.Map;
*
* <h3>Serialization and deserialization</h3>
*
* In order to serialize and deserialize a polymorphic object, you must specify the base type
* <p>In order to serialize and deserialize a polymorphic object, you must specify the base type
* explicitly.
*
* <pre>{@code
@ -149,7 +127,7 @@ import java.util.Map;
* String json = gson.toJson(diamond, Shape.class);
* }</pre>
*
* And then:
* <p>And then:
*
* <pre>{@code
* Shape shape = gson.fromJson(json, Shape.class);
@ -158,8 +136,8 @@ import java.util.Map;
public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
private final Class<?> baseType;
private final String typeFieldName;
private final Map<String, Class<?>> labelToSubtype = new LinkedHashMap<String, Class<?>>();
private final Map<Class<?>, String> subtypeToLabel = new LinkedHashMap<Class<?>, String>();
private final Map<String, Class<?>> labelToSubtype = new LinkedHashMap<>();
private final Map<Class<?>, String> subtypeToLabel = new LinkedHashMap<>();
private final boolean maintainType;
private RuntimeTypeAdapterFactory(
@ -179,7 +157,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
*/
public static <T> RuntimeTypeAdapterFactory<T> of(
Class<T> baseType, String typeFieldName, boolean maintainType) {
return new RuntimeTypeAdapterFactory<T>(baseType, typeFieldName, maintainType);
return new RuntimeTypeAdapterFactory<>(baseType, typeFieldName, maintainType);
}
/**
@ -187,7 +165,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
* the type field name. Type field names are case sensitive.
*/
public static <T> RuntimeTypeAdapterFactory<T> of(Class<T> baseType, String typeFieldName) {
return new RuntimeTypeAdapterFactory<T>(baseType, typeFieldName, false);
return new RuntimeTypeAdapterFactory<>(baseType, typeFieldName, false);
}
/**
@ -195,7 +173,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
* field name.
*/
public static <T> RuntimeTypeAdapterFactory<T> of(Class<T> baseType) {
return new RuntimeTypeAdapterFactory<T>(baseType, "type", false);
return new RuntimeTypeAdapterFactory<>(baseType, "type", false);
}
/**
@ -217,14 +195,46 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
}
/**
* Registers {@code type} identified by its {@link Class#getSimpleName simple name}. Labels are
* case sensitive.
* Registers {@code type} identified by {@code label}. Labels are case sensitive.
*
* @throws IllegalArgumentException if either {@code type} or its simple name have already been
* @throws IllegalArgumentException if either {@code type} or {@code label} have already been
* registered on this type adapter.
*/
public RuntimeTypeAdapterFactory<T> registerSubtype(Class<? extends T> type) {
return registerSubtype(type, type.getSimpleName());
registerSubtype(type, type.getSimpleName());
return this;
}
private void initMaps(
Gson gson,
Map<String, TypeAdapter<?>> labelToDelegate,
Map<Class<?>, TypeAdapter<?>> subtypeToDelegate) {
for (Map.Entry<String, Class<?>> entry : labelToSubtype.entrySet()) {
TypeAdapter<?> delegate =
gson.getDelegateAdapter(this, TypeToken.get(entry.getValue()));
labelToDelegate.put(entry.getKey(), delegate);
subtypeToDelegate.put(entry.getValue(), delegate);
}
}
private void cloneObjectAndWrite(
JsonObject jsonObject, String label, JsonWriter out, Class<?> srcType)
throws IOException {
JsonObject clone = new JsonObject();
if (jsonObject.has(typeFieldName)) {
throw new JsonParseException(
"cannot serialize "
+ srcType.getName()
+ " because it already defines a field named "
+ typeFieldName);
}
clone.add(typeFieldName, new JsonPrimitive(label));
for (Map.Entry<String, JsonElement> e : jsonObject.entrySet()) {
clone.add(e.getKey(), e.getValue());
}
Streams.write(clone, out);
}
public <R> TypeAdapter<R> create(Gson gson, TypeToken<R> type) {
@ -233,19 +243,16 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
}
final Map<String, TypeAdapter<?>> labelToDelegate =
new LinkedHashMap<String, TypeAdapter<?>>();
new LinkedHashMap<>(labelToSubtype.size());
final Map<Class<?>, TypeAdapter<?>> subtypeToDelegate =
new LinkedHashMap<Class<?>, TypeAdapter<?>>();
for (Map.Entry<String, Class<?>> entry : labelToSubtype.entrySet()) {
TypeAdapter<?> delegate =
gson.getDelegateAdapter(this, TypeToken.get(entry.getValue()));
labelToDelegate.put(entry.getKey(), delegate);
subtypeToDelegate.put(entry.getValue(), delegate);
}
new LinkedHashMap<>(labelToSubtype.size());
initMaps(gson, labelToDelegate, subtypeToDelegate);
final RuntimeTypeAdapterFactory<T> that = this;
return new TypeAdapter<R>() {
@Override
public R read(JsonReader in) throws IOException {
public R read(JsonReader in) {
JsonElement jsonElement = Streams.parse(in);
JsonElement labelJsonElement;
if (maintainType) {
@ -294,21 +301,7 @@ public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory {
return;
}
JsonObject clone = new JsonObject();
if (jsonObject.has(typeFieldName)) {
throw new JsonParseException(
"cannot serialize "
+ srcType.getName()
+ " because it already defines a field named "
+ typeFieldName);
}
clone.add(typeFieldName, new JsonPrimitive(label));
for (Map.Entry<String, JsonElement> e : jsonObject.entrySet()) {
clone.add(e.getKey(), e.getValue());
}
Streams.write(clone, out);
that.cloneObjectAndWrite(jsonObject, label, out, srcType);
}
}.nullSafe();
}

View File

@ -5,17 +5,16 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTResponse;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.UnauthorizedException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.UserNotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.User;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.JWTUserDetailsService;
import java.security.Principal;
import javax.validation.Valid;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.JWTUserDetailsService;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;
@RestController
@ -30,8 +29,6 @@ public class AuthenticationController {
private final JWTUserDetailsService userDetailsService;
private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
public AuthenticationController(
AuthenticationManager authenticationManager,
UserRepository userRepository,
@ -82,9 +79,9 @@ public class AuthenticationController {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password));
} catch (DisabledException e) {
throw new UnauthorizedException(true);
throw new UnauthorizedException(true, e);
} catch (BadCredentialsException e) {
throw new UnauthorizedException(false);
throw new UnauthorizedException(false, e);
}
}
}

View File

@ -2,6 +2,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.AutomationFastUpdateRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.AutomationSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.ConditionDTO;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.ScenePriorityDTO;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.TriggerDTO;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import java.security.Principal;
@ -10,15 +13,7 @@ import java.util.stream.Collectors;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -28,13 +23,13 @@ public class AutomationController {
@Autowired private AutomationRepository automationRepository;
@Autowired private ScenePriorityRepository sceneRepository;
@Autowired private TriggerRepository<Trigger<?>> triggerRepository;
@Autowired private ConditionRepository<Condition<?>> conditionRepository;
@Autowired private UserRepository userService;
@GetMapping
public List<Automation> getAll(
@RequestParam(value = "hostId", required = false) Long hostId,
final Principal principal)
throws NotFoundException {
final Principal principal) {
final Long userId = userService.findByUsername(principal.getName()).getId();
return automationRepository.findAllByUserId(userId);
}
@ -87,26 +82,45 @@ public class AutomationController {
triggerRepository.deleteAllByAutomationId(a.getId());
sceneRepository.deleteAllByAutomationId(a.getId());
conditionRepository.deleteAllByAutomationId(a.getId());
Iterable<Trigger<?>> tt =
triggerRepository.saveAll(
req.getTriggers()
.stream()
.map(AutomationFastUpdateRequest.TriggerDTO::toModel)
.map(TriggerDTO::toModel)
.map(t -> t.setAutomationId(a.getId()))
.collect(Collectors.toList()));
Iterable<ScenePriority> ss =
sceneRepository.saveAll(
req.getScenes()
.stream()
.map(AutomationFastUpdateRequest.ScenePriorityDTO::toModel)
.map(ScenePriorityDTO::toModel)
.collect(Collectors.toList()));
Iterable<Condition<?>> cc =
conditionRepository.saveAll(
req.getConditions()
.stream()
.map(ConditionDTO::toModel)
.map(t -> t.setAutomationId(a.getId()))
.collect(Collectors.toList()));
for (final ScenePriority s : ss) {
s.setAutomationId(a.getId());
// this is here just to pass the quality gate,
// please do not replicate unless the quality gate sees
// it as a bug
s.setAutomation(a);
}
a.getScenes().clear();
a.getTriggers().clear();
a.getConditions().clear();
ss.forEach(t -> a.getScenes().add(t));
tt.forEach(t -> a.getTriggers().add(t));
cc.forEach(t -> a.getConditions().add(t));
return a;
}

View File

@ -0,0 +1,54 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.BooleanConditionOrTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanCondition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanConditionRepository;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@RequestMapping("/booleanCondition")
public class BooleanConditionController {
@Autowired BooleanConditionRepository booleanConditionRepository;
@GetMapping("/{automationId}")
public List<BooleanCondition> getAll(@PathVariable long automationId) {
return booleanConditionRepository.findAllByAutomationId(automationId);
}
private BooleanCondition save(BooleanCondition newRL, BooleanConditionOrTriggerSaveRequest s) {
newRL.setDeviceId(s.getDeviceId());
newRL.setAutomationId(s.getAutomationId());
newRL.setOn(s.isOn());
return booleanConditionRepository.save(newRL);
}
@PostMapping
public BooleanCondition create(
@Valid @RequestBody BooleanConditionOrTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new BooleanCondition(), booleanTriggerSaveRequest);
}
@PutMapping
public BooleanCondition update(
@Valid @RequestBody BooleanConditionOrTriggerSaveRequest booleanTriggerSaveRequest)
throws NotFoundException {
return save(
booleanConditionRepository
.findById(booleanTriggerSaveRequest.getId())
.orElseThrow(NotFoundException::new),
booleanTriggerSaveRequest);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
booleanConditionRepository.deleteById(id);
}
}

View File

@ -1,6 +1,6 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.BooleanTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.BooleanConditionOrTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanTriggerRepository;
@ -8,14 +8,7 @@ import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -25,11 +18,11 @@ public class BooleanTriggerController {
@Autowired BooleanTriggerRepository booleanTriggerRepository;
@GetMapping("/{automationId}")
public List<BooleanTrigger<?>> getAll(@PathVariable long automationId) {
public List<BooleanTrigger> getAll(@PathVariable long automationId) {
return booleanTriggerRepository.findAllByAutomationId(automationId);
}
private BooleanTrigger<?> save(BooleanTrigger<?> newRL, BooleanTriggerSaveRequest s) {
private BooleanTrigger save(BooleanTrigger newRL, BooleanConditionOrTriggerSaveRequest s) {
newRL.setDeviceId(s.getDeviceId());
newRL.setAutomationId(s.getAutomationId());
newRL.setOn(s.isOn());
@ -38,14 +31,14 @@ public class BooleanTriggerController {
}
@PostMapping
public BooleanTrigger<?> create(
@Valid @RequestBody BooleanTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new BooleanTrigger<>(), booleanTriggerSaveRequest);
public BooleanTrigger create(
@Valid @RequestBody BooleanConditionOrTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new BooleanTrigger(), booleanTriggerSaveRequest);
}
@PutMapping
public BooleanTrigger<?> update(
@Valid @RequestBody BooleanTriggerSaveRequest booleanTriggerSaveRequest)
public BooleanTrigger update(
@Valid @RequestBody BooleanConditionOrTriggerSaveRequest booleanTriggerSaveRequest)
throws NotFoundException {
return save(
booleanTriggerRepository

View File

@ -1,9 +1,12 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.ButtonDimmerDimRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveReguest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ButtonDimmer;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ButtonDimmerRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Dimmable;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
import java.util.Set;
@ -18,22 +21,27 @@ import org.springframework.web.bind.annotation.*;
public class ButtonDimmerController
extends InputDeviceConnectionController<ButtonDimmer, Dimmable> {
private DeviceService deviceService;
private ButtonDimmerRepository buttonDimmerRepository;
private final DeviceService deviceService;
private final ButtonDimmerRepository buttonDimmerRepository;
@Autowired
protected ButtonDimmerController(
ButtonDimmerRepository inputRepository,
DimmableRepository<Dimmable> outputRepository,
DeviceService deviceService) {
super(inputRepository, outputRepository, DimmableLight.BUTTON_DIMMER_DIMMABLE_CONNECTOR);
super(inputRepository, outputRepository, deviceService);
this.deviceService = deviceService;
this.buttonDimmerRepository = inputRepository;
}
@GetMapping("/{id}")
public ButtonDimmer findById(@PathVariable("id") long id) throws NotFoundException {
return buttonDimmerRepository.findById(id).orElseThrow(NotFoundException::new);
}
@PostMapping
public ButtonDimmer create(
@Valid @RequestBody final GenericDeviceSaveReguest bd, final Principal principal)
@Valid @RequestBody final GenericDeviceSaveRequest bd, final Principal principal)
throws NotFoundException {
deviceService.throwIfRoomNotOwned(bd.getRoomId(), principal.getName());
@ -53,23 +61,21 @@ public class ButtonDimmerController
.findByIdAndUsername(bd.getId(), principal.getName())
.orElseThrow(NotFoundException::new);
switch (bd.getDimType()) {
case UP:
buttonDimmer.increaseIntensity();
break;
case DOWN:
buttonDimmer.decreaseIntensity();
break;
if (bd.getDimType() == ButtonDimmerDimRequest.DimType.UP) {
buttonDimmer.increaseIntensity();
} else {
buttonDimmer.decreaseIntensity();
}
deviceService.saveAllAsOwner(buttonDimmer.getOutputs(), principal.getName(), false);
deviceService.saveAllAsOwner(buttonDimmer.getOutputs(), principal.getName());
return buttonDimmer.getOutputs();
return buttonDimmer.getDimmables();
}
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
}

View File

@ -18,7 +18,7 @@ public class CurtainsController {
@Autowired private DeviceService deviceService;
@Autowired private CurtainsRepository curtainsService;
@Autowired private SceneRepository sceneRepository;
@Autowired private StateRepository<State<?>> stateRepository;
@Autowired private StateRepository<State> stateRepository;
private Curtains save(Curtains newRL, DimmableSaveRequest s, final Principal principal) {
newRL.setName(s.getName());
@ -49,11 +49,11 @@ public class CurtainsController {
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
@PostMapping("/{id}/state")
public State<? extends Dimmable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -63,9 +63,9 @@ public class CurtainsController {
curtainsService
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Dimmable> s = c.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = c.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -5,6 +5,7 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.error.BadDataException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Device;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DeviceRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RoomRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
@ -40,11 +41,12 @@ public class DeviceController {
.orElseThrow(NotFoundException::new);
// check if roomId is valid
roomRepository
.findByIdAndUsername(deviceSaveRequest.getRoomId(), principal.getName())
.orElseThrow(() -> new BadDataException("roomId is not a valid room id"));
final Room r =
roomRepository
.findByIdAndUsername(deviceSaveRequest.getRoomId(), principal.getName())
.orElseThrow(() -> new BadDataException("roomId is not a valid room id"));
d.setRoomId(deviceSaveRequest.getRoomId());
d.setRoomId(r.getId());
d.setName(deviceSaveRequest.getName());
deviceService.saveAsOwner(d, principal.getName());

View File

@ -16,17 +16,17 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/dimmableLight")
public class DimmableLightController extends GuestEnabledController<DimmableLight> {
private DimmableLightRepository dimmableLightRepository;
private SceneRepository sceneRepository;
private StateRepository<State<?>> stateRepository;
private DeviceService deviceService;
private final DimmableLightRepository dimmableLightRepository;
private final SceneRepository sceneRepository;
private final StateRepository<State> stateRepository;
private final DeviceService deviceService;
@Autowired
public DimmableLightController(
UserRepository userRepository,
DimmableLightRepository dimmableLightRepository,
SceneRepository sceneRepository,
StateRepository<State<?>> stateRepository,
StateRepository<State> stateRepository,
DeviceService deviceService) {
super(userRepository, dimmableLightRepository);
this.dimmableLightRepository = dimmableLightRepository;
@ -49,10 +49,10 @@ public class DimmableLightController extends GuestEnabledController<DimmableLigh
}
}
/*
Assume that only the host can create a device
Here save always as host, but remember to propagate change to guests (DeviceService.saveAsOwner())
*/
/**
* Assume that only the host can create a device Here save always as host, but remember to
* propagate change to guests (DeviceService.saveAsOwner())
*/
@PostMapping
public DimmableLight create(
@Valid @RequestBody DimmableSaveRequest dl, final Principal principal)
@ -61,12 +61,12 @@ public class DimmableLightController extends GuestEnabledController<DimmableLigh
return save(new DimmableLight(), dl, principal.getName(), null);
}
/*
Logic for saving either as owner or guest is handled in method save of this controller
*/
/** Logic for saving either as owner or guest is handled in method save of this controller */
@PutMapping
public DimmableLight update(
@Valid @RequestBody DimmableSaveRequest sp, final Principal principal, Long hostId)
@Valid @RequestBody DimmableSaveRequest sp,
final Principal principal,
@RequestParam(value = "hostId", required = false) Long hostId)
throws NotFoundException {
return save(
@ -79,13 +79,15 @@ public class DimmableLightController extends GuestEnabledController<DimmableLigh
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
// the full url should be: "/dimmableLight/{id}/state?sceneId={sceneId}
// however it is not necessary to specify the query in the mapping
/**
* the full url should be: "/dimmableLight/{id}/state?sceneId={sceneId} however it is not
* necessary to specify the query in the mapping
*/
@PostMapping("/{id}/state")
public State<? extends Dimmable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -95,9 +97,9 @@ public class DimmableLightController extends GuestEnabledController<DimmableLigh
dimmableLightRepository
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Dimmable> s = d.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = d.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -17,9 +17,9 @@ public class DimmableStateController {
@Autowired private DimmableStateRepository dimmableStateRepository;
@PutMapping
public DimmableState<?> update(@Valid @RequestBody DimmableStateSaveRequest ss)
public DimmableState update(@Valid @RequestBody DimmableStateSaveRequest ss)
throws NotFoundException {
final DimmableState<?> initial =
final DimmableState initial =
dimmableStateRepository.findById(ss.getId()).orElseThrow(NotFoundException::new);
initial.setIntensity(ss.getIntensity());
dimmableStateRepository.save(initial);

View File

@ -3,11 +3,15 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GuestPermissionsRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GuestsUpdateRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.UserResponse;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.EagerUserRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.User;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository;
import java.security.Principal;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@ -18,23 +22,47 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/user")
public class GuestController {
@Autowired private UserRepository userRepository;
@Autowired private EagerUserRepository userRepository;
@GetMapping
public List<User> findAll() {
return toList(userRepository.findAll());
public List<UserResponse> findAll() {
return StreamSupport.stream(userRepository.findAll().spliterator(), false)
.map(UserResponse::fromUser)
.collect(Collectors.toList());
}
@PostMapping("/guest")
public User addUserAsGuest(@RequestParam("userId") long id, final Principal principal)
throws NotFoundException {
User guest = userRepository.findById(id).orElseThrow(NotFoundException::new);
@GetMapping("/hosts")
public List<UserResponse> findHosts(final Principal principal) {
final User u = userRepository.findByUsername(principal.getName());
return u.getHosts().stream().map(UserResponse::fromUser).collect(Collectors.toList());
}
@GetMapping("/guests")
public List<UserResponse> findGuests(final Principal principal) {
final User u = userRepository.findByUsername(principal.getName());
return u.getGuests().stream().map(UserResponse::fromUser).collect(Collectors.toList());
}
@PutMapping("/guests")
public List<User> setGuests(
@RequestBody @Valid GuestsUpdateRequest g, final Principal principal) {
Iterable<User> guests = userRepository.findAllById(g.getIds());
User host = userRepository.findByUsername(principal.getName());
host.addGuest(guest);
guest.addHost(host);
userRepository.save(guest);
return userRepository.save(host);
for (final User oldGuest : host.getGuests()) {
oldGuest.getHosts().remove(host);
}
final Set<User> oldGuests = Set.copyOf(host.getGuests());
for (final User guest : guests) {
host.addGuest(guest);
guest.addHost(host);
}
userRepository.saveAll(oldGuests);
userRepository.save(host);
return toList(userRepository.saveAll(guests));
}
@PutMapping("/permissions")
@ -44,16 +72,4 @@ public class GuestController {
currentUser.setCameraEnabled(g.isCameraEnabled());
return userRepository.save(currentUser);
}
@DeleteMapping("/guest")
public void removeUserAsGuest(@RequestParam("userId") long id, final Principal principal)
throws NotFoundException {
User guest = userRepository.findById(id).orElseThrow(NotFoundException::new);
User host = userRepository.findByUsername(principal.getName());
host.removeGuest(guest);
guest.getHosts().remove(host);
userRepository.save(host);
userRepository.save(guest);
}
}

View File

@ -3,13 +3,15 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.returnIfGuest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Device;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DeviceRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository;
import java.security.Principal;
public abstract class GuestEnabledController<T extends Device> {
private UserRepository userRepository;
private DeviceRepository<T> deviceRepository;
private final UserRepository userRepository;
private final DeviceRepository<T> deviceRepository;
public GuestEnabledController(
final UserRepository userRepository, final DeviceRepository<T> deviceRepository) {

View File

@ -3,13 +3,15 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Connectable;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DeviceRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.InputDevice;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.OutputDevice;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@ -23,9 +25,9 @@ import org.springframework.web.bind.annotation.RequestBody;
* @param <O> the output device attached to I
*/
public abstract class InputDeviceConnectionController<
I extends InputDevice, O extends OutputDevice> {
I extends InputDevice & Connectable<O>, O extends OutputDevice> {
private class Connection {
protected class Connection {
private final I input;
private final List<O> outputs;
@ -33,30 +35,43 @@ public abstract class InputDeviceConnectionController<
this.input = input;
this.outputs = outputs;
}
public I getInput() {
return input;
}
public List<O> getOutputs() {
return outputs;
}
}
@Autowired private DeviceService deviceService;
protected DeviceRepository<I> getInputRepository() {
return inputRepository;
}
private DeviceRepository<I> inputRepository;
protected DeviceRepository<O> getOutputReposiory() {
return outputReposiory;
}
private DeviceRepository<O> outputReposiory;
private final DeviceService deviceService;
private Connector<I, O> connector;
private final DeviceRepository<I> inputRepository;
private final DeviceRepository<O> outputReposiory;
/**
* Contstructs the controller by requiring essential object for the controller implementation
*
* @param inputRepository the input device repository
* @param outputRepository the output device repository
* @param connector a appropriate Connector instance for the I and O tyoes.
*/
protected InputDeviceConnectionController(
DeviceRepository<I> inputRepository,
DeviceRepository<O> outputRepository,
Connector<I, O> connector) {
DeviceService deviceService) {
this.inputRepository = inputRepository;
this.outputReposiory = outputRepository;
this.connector = connector;
this.deviceService = deviceService;
}
private Connection checkConnectionIDs(Long inputId, List<Long> outputs, String username)
@ -65,7 +80,7 @@ public abstract class InputDeviceConnectionController<
inputRepository
.findByIdAndUsername(inputId, username)
.orElseThrow(() -> new NotFoundException("input device"));
final List<O> outputDevices = new ArrayList<>();
final List<O> outputDevices = new ArrayList<>(outputs.size());
for (final Long outputId : outputs) {
outputDevices.add(
outputReposiory
@ -83,16 +98,16 @@ public abstract class InputDeviceConnectionController<
* @return the list of output devices attached to the input device of id inputId
* @throws NotFoundException if inputId or outputId are not valid
*/
protected Set<? extends OutputDevice> addOutput(
Long inputId, List<Long> outputs, String username) throws NotFoundException {
protected Set<OutputDevice> addOutput(Long inputId, List<Long> outputs, String username)
throws NotFoundException {
final Connection pair = checkConnectionIDs(inputId, outputs, username);
for (final O o : pair.outputs) {
connector.connect(pair.input, o, true);
for (final O o : pair.getOutputs()) {
pair.getInput().connect(o, true);
}
deviceService.saveAllAsOwner(pair.outputs, username, false);
return pair.input.getOutputs();
deviceService.saveAllAsOwner(pair.getOutputs(), username);
return pair.getInput().getOutputs();
}
/**
@ -103,16 +118,16 @@ public abstract class InputDeviceConnectionController<
* @return the list of output devices attached to the input device of id inputId
* @throws NotFoundException if inputId or outputId are not valid
*/
protected Set<? extends OutputDevice> removeOutput(
Long inputId, List<Long> outputs, String username) throws NotFoundException {
protected Set<OutputDevice> removeOutput(Long inputId, List<Long> outputs, String username)
throws NotFoundException {
final Connection pair = checkConnectionIDs(inputId, outputs, username);
for (final O o : pair.outputs) {
connector.connect(pair.input, o, false);
for (final O o : pair.getOutputs()) {
pair.getInput().connect(o, false);
}
deviceService.saveAllAsOwner(pair.outputs, username, false);
return pair.input.getOutputs();
deviceService.saveAllAsOwner(pair.getOutputs(), username);
return pair.getInput().getOutputs();
}
@PostMapping("/{id}/lights")

View File

@ -1,9 +1,12 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveReguest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.KnobDimmerDimRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Dimmable;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmer;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmerRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
import java.util.Set;
@ -17,19 +20,27 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/knobDimmer")
public class KnobDimmerController extends InputDeviceConnectionController<KnobDimmer, Dimmable> {
@Autowired private DeviceService deviceService;
@Autowired private KnobDimmerRepository knobDimmerRepository;
private final DeviceService deviceService;
private final KnobDimmerRepository knobDimmerRepository;
@Autowired
protected KnobDimmerController(
KnobDimmerRepository inputRepository, DimmableRepository<Dimmable> outputRepository) {
super(inputRepository, outputRepository, Dimmable.KNOB_DIMMER_DIMMABLE_CONNECTOR);
KnobDimmerRepository inputRepository,
DimmableRepository<Dimmable> outputRepository,
DeviceService deviceService) {
super(inputRepository, outputRepository, deviceService);
this.knobDimmerRepository = inputRepository;
this.deviceService = deviceService;
}
@GetMapping("/{id}")
public KnobDimmer findById(@PathVariable("id") long id) throws NotFoundException {
return knobDimmerRepository.findById(id).orElseThrow(NotFoundException::new);
}
@PostMapping
public KnobDimmer create(
@Valid @RequestBody GenericDeviceSaveReguest kd, final Principal principal)
@Valid @RequestBody GenericDeviceSaveRequest kd, final Principal principal)
throws NotFoundException {
deviceService.throwIfRoomNotOwned(kd.getRoomId(), principal.getName());
KnobDimmer newKD = new KnobDimmer();
@ -49,14 +60,14 @@ public class KnobDimmerController extends InputDeviceConnectionController<KnobDi
.orElseThrow(NotFoundException::new);
dimmer.setLightIntensity(bd.getIntensity());
deviceService.saveAllAsOwner(dimmer.getOutputs(), principal.getName(), false);
deviceService.saveAllAsOwner(dimmer.getOutputs(), principal.getName());
return dimmer.getOutputs();
return dimmer.getDimmables();
}
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
}

View File

@ -1,12 +1,11 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveReguest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.MotionSensor;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.MotionSensorRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.MotionSensorService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.socket.SensorSocketEndpoint;
import java.security.Principal;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
@ -21,11 +20,10 @@ public class MotionSensorController {
@Autowired private DeviceService deviceService;
@Autowired private MotionSensorService motionSensorService;
@Autowired private MotionSensorRepository motionSensorRepository;
@Autowired private SensorSocketEndpoint sensorSocketEndpoint;
@PostMapping
public MotionSensor create(
@Valid @RequestBody GenericDeviceSaveReguest ms, final Principal principal)
@Valid @RequestBody GenericDeviceSaveRequest ms, final Principal principal)
throws NotFoundException {
deviceService.throwIfRoomNotOwned(ms.getRoomId(), principal.getName());
MotionSensor newMS = new MotionSensor();
@ -53,6 +51,6 @@ public class MotionSensorController {
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
}

View File

@ -0,0 +1,55 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.RangeConditionOrTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeCondition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeConditionRepository;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@RequestMapping("/rangeCondition")
public class RangeConditionController {
@Autowired RangeConditionRepository rangeConditionRepository;
@GetMapping("/{automationId}")
public List<RangeCondition> getAll(@PathVariable long automationId) {
return rangeConditionRepository.findAllByAutomationId(automationId);
}
private RangeCondition save(RangeCondition newRL, RangeConditionOrTriggerSaveRequest s) {
newRL.setDeviceId(s.getDeviceId());
newRL.setAutomationId(s.getAutomationId());
newRL.setOperator(s.getOperator());
newRL.setRange(s.getRange());
return rangeConditionRepository.save(newRL);
}
@PostMapping
public RangeCondition create(
@Valid @RequestBody RangeConditionOrTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new RangeCondition(), booleanTriggerSaveRequest);
}
@PutMapping
public RangeCondition update(
@Valid @RequestBody RangeConditionOrTriggerSaveRequest booleanTriggerSaveRequest)
throws NotFoundException {
return save(
rangeConditionRepository
.findById(booleanTriggerSaveRequest.getId())
.orElseThrow(NotFoundException::new),
booleanTriggerSaveRequest);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
rangeConditionRepository.deleteById(id);
}
}

View File

@ -1,6 +1,6 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.RangeTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.RangeConditionOrTriggerSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeTriggerRepository;
@ -8,14 +8,7 @@ import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -25,11 +18,11 @@ public class RangeTriggerController {
@Autowired RangeTriggerRepository rangeTriggerRepository;
@GetMapping("/{automationId}")
public List<RangeTrigger<?>> getAll(@PathVariable long automationId) {
public List<RangeTrigger> getAll(@PathVariable long automationId) {
return rangeTriggerRepository.findAllByAutomationId(automationId);
}
private RangeTrigger<?> save(RangeTrigger<?> newRL, RangeTriggerSaveRequest s) {
private RangeTrigger save(RangeTrigger newRL, RangeConditionOrTriggerSaveRequest s) {
newRL.setDeviceId(s.getDeviceId());
newRL.setAutomationId(s.getAutomationId());
newRL.setOperator(s.getOperator());
@ -39,14 +32,14 @@ public class RangeTriggerController {
}
@PostMapping
public RangeTrigger<?> create(
@Valid @RequestBody RangeTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new RangeTrigger<>(), booleanTriggerSaveRequest);
public RangeTrigger create(
@Valid @RequestBody RangeConditionOrTriggerSaveRequest booleanTriggerSaveRequest) {
return save(new RangeTrigger(), booleanTriggerSaveRequest);
}
@PutMapping
public RangeTrigger<?> update(
@Valid @RequestBody RangeTriggerSaveRequest booleanTriggerSaveRequest)
public RangeTrigger update(
@Valid @RequestBody RangeConditionOrTriggerSaveRequest booleanTriggerSaveRequest)
throws NotFoundException {
return save(
rangeTriggerRepository

View File

@ -12,32 +12,24 @@ import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@RequestMapping("/regularLight")
public class RegularLightController extends GuestEnabledController<RegularLight> {
private RegularLightRepository regularLightRepository;
private SceneRepository sceneRepository;
private StateRepository<State<?>> stateRepository;
private DeviceService deviceService;
private final RegularLightRepository regularLightRepository;
private final SceneRepository sceneRepository;
private final StateRepository<State> stateRepository;
private final DeviceService deviceService;
@Autowired
public RegularLightController(
UserRepository userRepository,
RegularLightRepository regularLightRepository,
SceneRepository sceneRepository,
StateRepository<State<?>> stateRepository,
StateRepository<State> stateRepository,
DeviceService deviceService) {
super(userRepository, regularLightRepository);
this.regularLightRepository = regularLightRepository;
@ -80,7 +72,9 @@ public class RegularLightController extends GuestEnabledController<RegularLight>
@PutMapping
public RegularLight update(
@Valid @RequestBody SwitchableSaveRequest rl, final Principal principal, Long hostId)
@Valid @RequestBody SwitchableSaveRequest rl,
final Principal principal,
@RequestParam(value = "hostId", required = false) Long hostId)
throws NotFoundException {
return save(
fetchIfOwnerOrGuest(principal, rl.getId(), hostId),
@ -92,13 +86,11 @@ public class RegularLightController extends GuestEnabledController<RegularLight>
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
// the full url should be: "/regularLight/{id}/state?sceneId={sceneId}
// however it is not necessary to specify the query in the mapping
@PostMapping("/{id}/state")
public State<? extends Switchable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -107,9 +99,9 @@ public class RegularLightController extends GuestEnabledController<RegularLight>
regularLightRepository
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Switchable> s = d.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = d.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -6,13 +6,12 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.RoomSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.ThermostatService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils;
import java.security.Principal;
import java.util.*;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@ -20,19 +19,33 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/room")
public class RoomController {
@Autowired private RoomRepository roomRepository;
private final RoomRepository roomRepository;
@Autowired private UserRepository userRepository;
private final UserRepository userRepository;
@Autowired private DeviceService deviceService;
private final DeviceService deviceService;
@Autowired private SwitchRepository switchRepository;
private final SwitchRepository switchRepository;
@Autowired private ButtonDimmerRepository buttonDimmerRepository;
private final ButtonDimmerRepository buttonDimmerRepository;
@Autowired private KnobDimmerRepository knobDimmerRepository;
private final KnobDimmerRepository knobDimmerRepository;
@Autowired private ThermostatService thermostatService;
@Autowired
public RoomController(
RoomRepository roomRepository,
UserRepository userRepository,
DeviceService deviceService,
SwitchRepository switchRepository,
ButtonDimmerRepository buttonDimmerRepository,
KnobDimmerRepository knobDimmerRepository) {
this.roomRepository = roomRepository;
this.userRepository = userRepository;
this.deviceService = deviceService;
this.switchRepository = switchRepository;
this.buttonDimmerRepository = buttonDimmerRepository;
this.knobDimmerRepository = knobDimmerRepository;
}
private <T> List<T> fetchOwnerOrGuest(
final List<T> list, Long hostId, final Principal principal) throws NotFoundException {
@ -75,7 +88,7 @@ public class RoomController {
final String username = principal.getName();
final Long userId = userRepository.findByUsername(username).getId();
final String img = r.getImage();
final Room.Icon icon = r.getIcon();
final Icon icon = r.getIcon();
final Room newRoom = new Room();
newRoom.setUserId(userId);
@ -95,7 +108,7 @@ public class RoomController {
.findByIdAndUsername(id, principal.getName())
.orElseThrow(NotFoundException::new);
final String img = r.getImage();
final Room.Icon icon = r.getIcon();
final Icon icon = r.getIcon();
if (r.getName() != null) {
newRoom.setName(r.getName());
@ -124,6 +137,11 @@ public class RoomController {
roomRepository
.findByIdAndUsername(id, principal.getName())
.orElseThrow(NotFoundException::new);
List<Device> devices = deviceService.findAll(r.getId(), null, principal.getName());
for (Device d : devices) {
deviceService.deleteByIdAsOwner(d.getId(), principal.getName());
}
roomRepository.delete(r);
}

View File

@ -6,20 +6,13 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SceneSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.SceneService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils;
import java.security.Principal;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -27,21 +20,20 @@ import org.springframework.web.bind.annotation.RestController;
public class SceneController {
@Autowired private SceneRepository sceneRepository;
@Autowired private UserRepository userRepository;
@Autowired private SceneService sceneService;
@Autowired private UserRepository userService;
@Autowired private StateRepository<State<?>> stateService;
@Autowired private StateRepository<State> stateRepository;
@GetMapping
public List<Scene> findAll(Principal principal) {
return toList(sceneRepository.findByUsername(principal.getName()));
}
@GetMapping("/{id}")
public @ResponseBody Scene findById(@PathVariable("id") long id, Principal principal)
public List<Scene> findAll(
Principal principal, @RequestParam(value = "hostId", required = false) Long hostId)
throws NotFoundException {
return sceneRepository
.findByIdAndUsername(id, principal.getName())
.orElseThrow(NotFoundException::new);
if (hostId == null) {
return toList(sceneRepository.findByUsername(principal.getName()));
} else {
Utils.returnIfGuest(userRepository, null, hostId, principal);
return sceneRepository.findByHostId(hostId);
}
}
@PostMapping
@ -49,26 +41,58 @@ public class SceneController {
@Valid @RequestBody SceneSaveRequest s, final Principal principal) {
final String username = principal.getName();
final Long userId = userService.findByUsername(username).getId();
final Long userId = userRepository.findByUsername(username).getId();
final Scene newScene = new Scene();
newScene.setUserId(userId);
newScene.setName(s.getName());
newScene.setGuestAccessEnabled(s.isGuestAccessEnabled());
newScene.setIcon(s.getIcon());
return sceneRepository.save(newScene);
}
@PostMapping("/{id}/apply")
public @ResponseBody List<Device> apply(@PathVariable("id") long id, final Principal principal)
public @ResponseBody List<Device> apply(
@PathVariable("id") long id,
final Principal principal,
@RequestParam(value = "hostId", required = false) Long hostId)
throws NotFoundException {
final Scene newScene =
if (hostId == null) {
return sceneService.apply(
sceneRepository
.findByIdAndUsername(id, principal.getName())
.orElseThrow(NotFoundException::new),
principal.getName(),
false);
} else {
Utils.returnIfGuest(userRepository, null, hostId, principal);
return sceneService.applyAsGuest(
sceneRepository
.findByIdAndUserIdAndGuestAccessEnabled(id, hostId, true)
.orElseThrow(NotFoundException::new),
principal.getName(),
hostId);
}
}
@PostMapping("/{id}/copyFrom/{copyId}")
public @ResponseBody List<State> copy(
@PathVariable("id") long id,
@PathVariable("copyId") long copyId,
final Principal principal)
throws NotFoundException {
final Scene scene =
sceneRepository
.findByIdAndUsername(id, principal.getName())
.orElseThrow(NotFoundException::new);
final Scene copyFrom =
sceneRepository
.findByIdAndUsername(copyId, principal.getName())
.orElseThrow(NotFoundException::new);
return sceneService.apply(newScene);
return sceneService.copyStates(scene, copyFrom);
}
@PutMapping("/{id}")
@ -84,6 +108,8 @@ public class SceneController {
newScene.setName(s.getName());
}
newScene.setIcon(s.getIcon());
newScene.setGuestAccessEnabled(s.isGuestAccessEnabled());
return sceneRepository.save(newScene);
@ -91,7 +117,7 @@ public class SceneController {
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") long id) {
stateService.deleteAllBySceneId(id);
stateRepository.deleteAllBySceneId(id);
sceneRepository.deleteById(id);
}
@ -100,8 +126,8 @@ public class SceneController {
* id).
*/
@GetMapping(path = "/{sceneId}/states")
public List<State<?>> getDevices(@PathVariable("sceneId") long sceneId) {
Iterable<State<?>> states = stateService.findBySceneId(sceneId);
public List<State> getStates(@PathVariable("sceneId") long sceneId) {
Iterable<State> states = stateRepository.findBySceneId(sceneId);
return toList(states);
}
}

View File

@ -8,14 +8,7 @@ import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -24,10 +17,8 @@ public class ScenePriorityController {
@Autowired ScenePriorityRepository scenePriorityRepository;
@GetMapping("/{automationId}")
public List<ScenePriority> getByAutomationId(@PathVariable long automationId)
throws NotFoundException {
public List<ScenePriority> getByAutomationId(@PathVariable long automationId) {
return scenePriorityRepository.findAllByAutomationId(automationId);
}

View File

@ -1,5 +1,6 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.CameraConfigurationService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchableSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateStateException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
@ -9,31 +10,38 @@ import java.security.Principal;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@RequestMapping("/securityCamera")
public class SecurityCameraController {
private final DeviceService deviceService;
private final SecurityCameraRepository securityCameraService;
private final SceneRepository sceneRepository;
private final StateRepository<State> stateRepository;
private final CameraConfigurationService cameraConfigurationService;
@Autowired private DeviceService deviceService;
@Autowired private SecurityCameraRepository securityCameraService;
@Autowired private SceneRepository sceneRepository;
@Autowired private StateRepository<State<?>> stateRepository;
@Autowired private RoomRepository roomRepository;
@Autowired
public SecurityCameraController(
DeviceService deviceService,
SecurityCameraRepository securityCameraService,
SceneRepository sceneRepository,
StateRepository<State> stateRepository,
CameraConfigurationService cameraConfigurationService) {
this.deviceService = deviceService;
this.securityCameraService = securityCameraService;
this.sceneRepository = sceneRepository;
this.stateRepository = stateRepository;
this.cameraConfigurationService = cameraConfigurationService;
}
private SecurityCamera save(
SecurityCamera newSC, SwitchableSaveRequest sc, final Principal principal) {
newSC.setName(sc.getName());
newSC.setRoomId(sc.getRoomId());
newSC.setOn(sc.isOn());
newSC.setPath(cameraConfigurationService.getVideoUrl());
return deviceService.saveAsOwner(newSC, principal.getName());
}
@ -61,11 +69,11 @@ public class SecurityCameraController {
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
@PostMapping("/{id}/state")
public State<? extends Switchable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -75,9 +83,9 @@ public class SecurityCameraController {
securityCameraService
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Switchable> s = d.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = d.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -2,16 +2,15 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SensorSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Sensor;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SensorRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.SensorService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.socket.SensorSocketEndpoint;
import java.math.BigDecimal;
import java.security.Principal;
import java.util.*;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@ -19,13 +18,21 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/sensor")
public class SensorController {
@Autowired private DeviceService deviceService;
private final DeviceService deviceService;
@Autowired private SensorRepository sensorRepository;
private final SensorRepository sensorRepository;
@Autowired private SensorSocketEndpoint sensorSocketEndpoint;
private final SensorService sensorService;
@Autowired private SensorService sensorService;
@Autowired
public SensorController(
DeviceService deviceService,
SensorRepository sensorRepository,
SensorService sensorService) {
this.deviceService = deviceService;
this.sensorRepository = sensorRepository;
this.sensorService = sensorService;
}
@PostMapping
public Sensor create(@Valid @RequestBody SensorSaveRequest s, final Principal principal)
@ -54,9 +61,24 @@ public class SensorController {
value);
}
@PutMapping("/{id}/simulation")
public Sensor updateSimulation(
@PathVariable("id") Long sensorId,
@RequestBody BigDecimal error,
@RequestBody BigDecimal typical,
final Principal principal)
throws NotFoundException {
return sensorService.updateSimulationFromSensor(
sensorRepository
.findByIdAndUsername(sensorId, principal.getName())
.orElseThrow(NotFoundException::new),
error,
typical);
}
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
}

View File

@ -8,7 +8,7 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@ -19,11 +19,10 @@ public class SmartPlugController {
@Autowired private DeviceService deviceService;
@Autowired private SmartPlugRepository smartPlugRepository;
@Autowired private SceneRepository sceneRepository;
@Autowired private StateRepository<State<?>> stateRepository;
@Autowired private StateRepository<State> stateRepository;
private SmartPlug save(SmartPlug newSP, SwitchableSaveRequest sp, final Principal principal) {
newSP.setOn(sp.isOn());
newSP.setId(sp.getId());
newSP.setName(sp.getName());
newSP.setRoomId(sp.getRoomId());
@ -63,11 +62,11 @@ public class SmartPlugController {
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
@PostMapping("/{id}/state")
public State<? extends Switchable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -77,9 +76,9 @@ public class SmartPlugController {
smartPlugRepository
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Switchable> s = d.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = d.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -1,15 +1,18 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveReguest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.GenericDeviceSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchOperationRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Switch;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Switchable;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableRepository;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import java.security.Principal;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@ -17,9 +20,8 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/switch")
public class SwitchController extends InputDeviceConnectionController<Switch, Switchable> {
private SwitchRepository switchRepository;
private SwitchableRepository<Switchable> switchableRepository;
private DeviceService deviceService;
private final SwitchRepository switchRepository;
private final DeviceService deviceService;
/**
* Contstructs the controller by requiring essential object for the controller implementation
@ -32,13 +34,18 @@ public class SwitchController extends InputDeviceConnectionController<Switch, Sw
SwitchRepository inputRepository,
SwitchableRepository<Switchable> outputRepository,
DeviceService deviceService) {
super(inputRepository, outputRepository, Switchable.SWITCH_SWITCHABLE_CONNECTOR);
super(inputRepository, outputRepository, deviceService);
this.deviceService = deviceService;
this.switchRepository = inputRepository;
}
@GetMapping("/{id}")
public Switch findById(@PathVariable("id") long id) throws NotFoundException {
return switchRepository.findById(id).orElseThrow(NotFoundException::new);
}
@PostMapping
public Switch create(@Valid @RequestBody GenericDeviceSaveReguest s, final Principal principal)
public Switch create(@Valid @RequestBody GenericDeviceSaveRequest s, final Principal principal)
throws NotFoundException {
deviceService.throwIfRoomNotOwned(s.getRoomId(), principal.getName());
Switch newSwitch = new Switch();
@ -70,12 +77,12 @@ public class SwitchController extends InputDeviceConnectionController<Switch, Sw
}
deviceService.saveAsOwner(s, principal.getName());
return deviceService.saveAllAsOwner(s.getOutputs(), principal.getName(), false);
return deviceService.saveAllAsOwner(s.getSwitchables(), principal.getName());
}
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
}

View File

@ -7,12 +7,7 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableStateRepository;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@ -22,9 +17,9 @@ public class SwitchableStateController {
@Autowired private SwitchableStateRepository switchableStateRepository;
@PutMapping
public SwitchableState<?> update(@Valid @RequestBody SwitchableStateSaveRequest ss)
public SwitchableState update(@Valid @RequestBody SwitchableStateSaveRequest ss)
throws NotFoundException {
final SwitchableState<?> initial =
final SwitchableState initial =
switchableStateRepository.findById(ss.getId()).orElseThrow(NotFoundException::new);
initial.setOn(ss.isOn());
switchableStateRepository.save(initial);

View File

@ -0,0 +1,55 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.ThermostatConditionSaveRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatCondition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatConditionRepository;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
@RequestMapping("/thermostatCondition")
public class ThermostatConditionController {
@Autowired ThermostatConditionRepository thermostatConditionRepository;
@GetMapping("/{automationId}")
public List<ThermostatCondition> getAll(@PathVariable long automationId) {
return thermostatConditionRepository.findAllByAutomationId(automationId);
}
private ThermostatCondition save(ThermostatCondition newRL, ThermostatConditionSaveRequest s) {
newRL.setDeviceId(s.getDeviceId());
newRL.setAutomationId(s.getAutomationId());
newRL.setOperator(s.getOperator());
newRL.setMode(s.getMode());
return thermostatConditionRepository.save(newRL);
}
@PostMapping
public ThermostatCondition create(
@Valid @RequestBody ThermostatConditionSaveRequest booleanTriggerSaveRequest) {
return save(new ThermostatCondition(), booleanTriggerSaveRequest);
}
@PutMapping
public ThermostatCondition update(
@Valid @RequestBody ThermostatConditionSaveRequest booleanTriggerSaveRequest)
throws NotFoundException {
return save(
thermostatConditionRepository
.findById(booleanTriggerSaveRequest.getId())
.orElseThrow(NotFoundException::new),
booleanTriggerSaveRequest);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
thermostatConditionRepository.deleteById(id);
}
}

View File

@ -5,11 +5,11 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateStateException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.DeviceService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.ThermostatService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.ThermostatPopulationService;
import java.security.Principal;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.*;
@RestController
@ -19,22 +19,29 @@ public class ThermostatController {
@Autowired private DeviceService deviceService;
@Autowired private ThermostatRepository thermostatRepository;
@Autowired private ThermostatService thermostatService;
@Autowired private ThermostatPopulationService thermostatService;
@Autowired private SceneRepository sceneRepository;
@Autowired private StateRepository<State<?>> stateRepository;
@Autowired private StateRepository<State> stateRepository;
private Thermostat save(Thermostat newT, ThermostatSaveRequest t, final Principal principal) {
newT.setTargetTemperature(t.getTargetTemperature());
newT.setId(t.getId());
newT.setName(t.getName());
newT.setRoomId(t.getRoomId());
newT.setMeasuredTemperature(t.getMeasuredTemperature());
newT.setUseExternalSensors(t.isUseExternalSensors());
newT.setOn(t.isTurnOn());
newT.setOn(false);
if (t.getErr() != null) {
newT.setErr(t.getErr());
}
if (t.getTypical() != null) {
newT.setTypical(t.getTypical());
}
newT = deviceService.saveAsOwner(newT, principal.getName());
thermostatService.populateMeasuredTemperature(newT);
return newT;
newT = thermostatRepository.save(newT);
newT.setOn(t.isTurnOn());
return deviceService.saveAsOwner(newT, principal.getName());
}
@PostMapping
@ -58,11 +65,11 @@ public class ThermostatController {
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") long id, final Principal principal)
throws NotFoundException {
deviceService.delete(id, principal.getName());
deviceService.deleteByIdAsOwner(id, principal.getName());
}
@PostMapping("/{id}/state")
public State<? extends Switchable> sceneBinding(
public State sceneBinding(
@PathVariable("id") long deviceId,
@RequestParam long sceneId,
final Principal principal)
@ -72,9 +79,9 @@ public class ThermostatController {
thermostatRepository
.findByIdAndUsername(deviceId, principal.getName())
.orElseThrow(NotFoundException::new);
State<? extends Switchable> s = d.cloneState();
sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sceneId);
State s = d.cloneState();
final Scene sc = sceneRepository.findById(sceneId).orElseThrow(NotFoundException::new);
s.setSceneId(sc.getId());
if (stateRepository.countByDeviceIdAndSceneId(deviceId, sceneId) > 0)
throw new DuplicateStateException();
return stateRepository.save(s);

View File

@ -2,7 +2,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.EmailConfigurationService;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.InitPasswordResetRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.OkResponse;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.PasswordResetRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.UserRegistrationRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateRegistrationException;
@ -58,14 +57,14 @@ public class UserAccountController {
isRegistration
? emailConfig.getRegistrationSubject()
: emailConfig.getResetPasswordSubject());
mailMessage.setFrom("smarthut.sm@gmail.com");
mailMessage.setFrom(emailConfig.getFrom());
mailMessage.setText(
(isRegistration ? emailConfig.getRegistration() : emailConfig.getResetPassword())
+ " "
+ (isRegistration
? emailConfig.getRegistrationPath()
: emailConfig.getResetPasswordPath())
+ token.getConfirmationToken());
+ token.getConfirmToken());
emailSenderService.sendEmail(mailMessage);
}
@ -78,7 +77,7 @@ public class UserAccountController {
* @throws DuplicateRegistrationException if a user exists with same email or username
*/
@PostMapping
public OkResponse registerUser(@Valid @RequestBody UserRegistrationRequest registrationData)
public void registerUser(@Valid @RequestBody UserRegistrationRequest registrationData)
throws DuplicateRegistrationException {
final User existingEmailUser =
userRepository.findByEmailIgnoreCase(registrationData.getEmail());
@ -102,18 +101,11 @@ public class UserAccountController {
toSave.setEmail(registrationData.getEmail());
userRepository.save(toSave);
ConfirmationToken token;
do {
token = new ConfirmationToken(toSave);
} while (confirmationTokenRepository.findByConfirmationToken(
token.getConfirmationToken())
!= null);
ConfirmationToken token = new ConfirmationToken(toSave);
confirmationTokenRepository.save(token);
sendEmail(toSave.getEmail(), token, true);
return new OkResponse();
}
}
@ -125,7 +117,7 @@ public class UserAccountController {
* @throws UserNotFoundException if given email does not belong to any user
*/
@PostMapping("/init-reset-password")
public OkResponse initResetPassword(@Valid @RequestBody InitPasswordResetRequest resetRequest)
public void initResetPassword(@Valid @RequestBody InitPasswordResetRequest resetRequest)
throws UserNotFoundException {
final User toReset = userRepository.findByEmailIgnoreCase(resetRequest.getEmail());
@ -134,12 +126,8 @@ public class UserAccountController {
throw new UserNotFoundException();
}
ConfirmationToken token;
do {
token = new ConfirmationToken(toReset);
token.setResetPassword(true);
} while (confirmationTokenRepository.findByConfirmationToken(token.getConfirmationToken())
!= null);
ConfirmationToken token = new ConfirmationToken(toReset);
token.setResetPassword(true);
// Delete existing email password reset tokens
confirmationTokenRepository.deleteByUserAndResetPassword(toReset, true);
@ -148,8 +136,6 @@ public class UserAccountController {
confirmationTokenRepository.save(token);
sendEmail(toReset.getEmail(), token, false);
return new OkResponse();
}
/**
@ -160,15 +146,12 @@ public class UserAccountController {
* @throws EmailTokenNotFoundException if given token is not a valid token for password reset
*/
@PutMapping("/reset-password")
public OkResponse resetPassword(
@Valid @RequestBody PasswordResetRequest resetRequest,
final HttpServletResponse response)
throws EmailTokenNotFoundException, IOException {
public void resetPassword(@Valid @RequestBody PasswordResetRequest resetRequest)
throws EmailTokenNotFoundException {
final ConfirmationToken token =
confirmationTokenRepository.findByConfirmationToken(
resetRequest.getConfirmationToken());
confirmationTokenRepository.findByConfirmToken(resetRequest.getConfirmationToken());
if (token == null || !token.getResetPassword()) {
if (token == null || !token.isResetPassword()) {
throw new EmailTokenNotFoundException();
}
@ -178,8 +161,6 @@ public class UserAccountController {
// Delete token to prevent further password changes
confirmationTokenRepository.delete(token);
return new OkResponse();
}
/**
@ -196,9 +177,9 @@ public class UserAccountController {
final HttpServletResponse response)
throws EmailTokenNotFoundException, IOException {
final ConfirmationToken token =
confirmationTokenRepository.findByConfirmationToken(confirmationToken);
confirmationTokenRepository.findByConfirmToken(confirmationToken);
if (token != null && !token.getResetPassword()) {
if (token != null && !token.isResetPassword()) {
token.getUser().setEnabled(true);
userRepository.save(token.getUser());
response.sendRedirect(emailConfig.getRegistrationRedirect());

View File

@ -1,97 +1,18 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ScenePriority;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Trigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.ConditionDTO;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.ScenePriorityDTO;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation.TriggerDTO;
import java.util.List;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class AutomationFastUpdateRequest {
public abstract static class TriggerDTO {
@NotNull public long deviceId;
public abstract Trigger<?> toModel();
}
public static class BooleanTriggerDTO extends TriggerDTO {
@NotNull public boolean on;
@Override
public Trigger<?> toModel() {
BooleanTrigger<?> t = new BooleanTrigger<>();
t.setDeviceId(this.deviceId);
t.setOn(this.on);
return t;
}
}
public static class RangeTriggerDTO extends TriggerDTO {
@NotNull RangeTrigger.Operator operator;
@NotNull double range;
@Override
public Trigger<?> toModel() {
RangeTrigger<?> t = new RangeTrigger<>();
t.setDeviceId(this.deviceId);
t.setOperator(this.operator);
t.setRange(this.range);
return t;
}
}
public static class ScenePriorityDTO {
@NotNull public long sceneId;
@NotNull
@Min(0)
public Integer priority;
public ScenePriority toModel() {
ScenePriority s = new ScenePriority();
s.setSceneId(sceneId);
s.setPriority(priority);
return s;
}
}
@NotNull private List<ScenePriorityDTO> scenes;
@NotNull private List<TriggerDTO> triggers;
@NotNull private List<ConditionDTO> conditions;
@NotNull private long id;
@NotNull @NotEmpty private String name;
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ScenePriorityDTO> getScenes() {
return scenes;
}
public void setScenes(List<ScenePriorityDTO> scenes) {
this.scenes = scenes;
}
public List<TriggerDTO> getTriggers() {
return triggers;
}
public void setTriggers(List<TriggerDTO> triggers) {
this.triggers = triggers;
}
public void setId(long id) {
this.id = id;
}
}

View File

@ -2,22 +2,12 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class AutomationSaveRequest {
private long id;
@NotNull @NotEmpty private String name;
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,16 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class BooleanConditionOrTriggerSaveRequest {
private long id;
@NotNull private Long deviceId;
@NotNull private Long automationId;
private boolean on;
}

View File

@ -1,42 +0,0 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
public class BooleanTriggerSaveRequest {
private long id;
@NotNull private Long deviceId;
@NotNull private Long automationId;
private boolean on;
public long getId() {
return id;
}
public Long getDeviceId() {
return deviceId;
}
public void setDeviceId(Long deviceId) {
this.deviceId = deviceId;
}
public Long getAutomationId() {
return automationId;
}
public void setAutomationId(Long automationId) {
this.automationId = automationId;
}
public boolean isOn() {
return on;
}
public void setOn(boolean on) {
this.on = on;
}
}

View File

@ -1,8 +1,10 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.Data;
/** A 'dim' event from a button dimmer. */
@Data
public class ButtonDimmerDimRequest {
/** The device id */
@ -15,20 +17,4 @@ public class ButtonDimmerDimRequest {
/** Whether the dim is up or down */
@NotNull private DimType dimType;
public DimType getDimType() {
return dimType;
}
public void setDimType(DimType dimType) {
this.dimType = dimType;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

View File

@ -2,7 +2,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DeviceSaveRequest {
/** Device identifier */
private long id;
@ -15,28 +17,4 @@ public class DeviceSaveRequest {
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull @NotEmpty private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Long getRoomId() {
return roomId;
}
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -3,7 +3,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DimmableSaveRequest {
/** Device id (used only for update requests) */
@ -23,36 +25,4 @@ public class DimmableSaveRequest {
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull private String name;
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public void setName(String name) {
this.name = name;
}
public Long getRoomId() {
return roomId;
}
public String getName() {
return name;
}
public Integer getIntensity() {
return intensity;
}
public void setIntensity(Integer intensity) {
this.intensity = intensity;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}

View File

@ -3,7 +3,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DimmableStateSaveRequest {
/** Device id (used only for update requests) */
@ -13,16 +15,4 @@ public class DimmableStateSaveRequest {
@Min(0)
@Max(100)
private Integer intensity = 0;
public Integer getIntensity() {
return intensity;
}
public void setIntensity(Integer intensity) {
this.intensity = intensity;
}
public Long getId() {
return id;
}
}

View File

@ -2,7 +2,14 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
public class GenericDeviceSaveReguest {
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GenericDeviceSaveRequest {
/**
* The room this device belongs in, as a foreign key id. To use when updating and inserting from
* a REST call.
@ -11,20 +18,4 @@ public class GenericDeviceSaveReguest {
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull private String name;
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public void setName(String name) {
this.name = name;
}
public Long getRoomId() {
return roomId;
}
public String getName() {
return name;
}
}

View File

@ -1,13 +1,8 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import lombok.Data;
@Data
public class GuestPermissionsRequest {
private boolean cameraEnabled;
public boolean isCameraEnabled() {
return cameraEnabled;
}
public void setCameraEnabled(boolean cameraEnabled) {
this.cameraEnabled = cameraEnabled;
}
}

View File

@ -0,0 +1,10 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import java.util.List;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class GuestsUpdateRequest {
@NotNull private List<Long> ids;
}

View File

@ -3,8 +3,14 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/** DTO for password reset request */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InitPasswordResetRequest {
/**
* The user's email (validated according to criteria used in <code>&gt;input type="email"&lt;>
@ -14,12 +20,4 @@ public class InitPasswordResetRequest {
@Email(message = "Please provide a valid email address")
@Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address")
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@ -1,36 +1,14 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JWTRequest {
@NotNull private String usernameOrEmail;
@NotNull private String password;
public String getUsernameOrEmail() {
return this.usernameOrEmail;
}
public void setUsernameOrEmail(String usernameOrEmail) {
this.usernameOrEmail = usernameOrEmail;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "JWTRequest{"
+ "usernameOrEmail='"
+ usernameOrEmail
+ '\''
+ ", password='"
+ password
+ '\''
+ '}';
}
}

View File

@ -1,13 +1,10 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class JWTResponse {
private final String jwttoken;
public JWTResponse(String jwttoken) {
this.jwttoken = jwttoken;
}
public String getToken() {
return this.jwttoken;
}
}

View File

@ -3,7 +3,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class KnobDimmerDimRequest {
/** The device id */
@ -14,20 +16,4 @@ public class KnobDimmerDimRequest {
@Min(0)
@Max(100)
private Integer intensity;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getIntensity() {
return intensity;
}
public void setIntensity(Integer intensity) {
this.intensity = intensity;
}
}

View File

@ -1,6 +0,0 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
/** A dummy DTO to return when there is no data to return */
public class OkResponse {
private boolean success = true;
}

View File

@ -1,8 +1,16 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/** DTO for password reset request */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PasswordResetRequest {
@NotNull private String confirmationToken;
@ -15,20 +23,4 @@ public class PasswordResetRequest {
max = 255,
message = "Your password should be at least 6 characters long and up to 255 chars long")
private String password;
public String getConfirmationToken() {
return confirmationToken;
}
public void setConfirmationToken(String confirmationToken) {
this.confirmationToken = confirmationToken;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

View File

@ -0,0 +1,19 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Operator;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class RangeConditionOrTriggerSaveRequest {
private long id;
@NotNull private Long deviceId;
@NotNull private Long automationId;
@NotNull private Operator operator;
@NotNull private double range;
}

View File

@ -1,57 +0,0 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeTrigger;
import javax.validation.constraints.NotNull;
public class RangeTriggerSaveRequest {
private long id;
@NotNull private Long deviceId;
@NotNull private Long automationId;
@NotNull private RangeTrigger.Operator operator;
@NotNull private double range;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Long getDeviceId() {
return deviceId;
}
public void setDeviceId(Long deviceId) {
this.deviceId = deviceId;
}
public Long getAutomationId() {
return automationId;
}
public void setAutomationId(Long automationId) {
this.automationId = automationId;
}
public RangeTrigger.Operator getOperator() {
return operator;
}
public void setOperator(RangeTrigger.Operator operator) {
this.operator = operator;
}
public double getRange() {
return range;
}
public void setRange(Double range) {
this.range = range;
}
}

View File

@ -1,15 +1,19 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Icon;
import javax.persistence.Lob;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class RoomSaveRequest {
/** Room identifier */
private long id;
@NotNull private Room.Icon icon;
@NotNull private Icon icon;
/**
* Image is to be given as byte[]. In order to get an encoded string from it, the
@ -21,36 +25,4 @@ public class RoomSaveRequest {
/** The user given name of this room (e.g. 'Master bedroom') */
@NotNull private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Room.Icon getIcon() {
return icon;
}
public void setIcon(Room.Icon icon) {
this.icon = icon;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}

View File

@ -2,7 +2,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class ScenePrioritySaveRequest {
@NotNull private Long automationId;
@ -11,28 +13,4 @@ public class ScenePrioritySaveRequest {
private Integer priority;
@NotNull private Long sceneId;
public Long getAutomationId() {
return automationId;
}
public void setAutomationId(Long automationId) {
this.automationId = automationId;
}
public Integer getPriority() {
return priority;
}
public void setPriority(Integer priority) {
this.priority = priority;
}
public Long getSceneId() {
return sceneId;
}
public void setSceneId(Long sceneId) {
this.sceneId = sceneId;
}
}

View File

@ -1,8 +1,15 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import com.sun.istack.NotNull;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Icon;
import javax.persistence.Column;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SceneSaveRequest {
/** Room identifier */
@ -11,26 +18,8 @@ public class SceneSaveRequest {
/** The user given name of this room (e.g. 'Master bedroom') */
@NotNull private String name;
@NotNull private Icon icon;
/** Determines whether a guest can access this scene */
@Column @NotNull private boolean guestAccessEnabled;
public boolean isGuestAccessEnabled() {
return guestAccessEnabled;
}
public void setGuestAccessEnabled(boolean guestAccessEnabled) {
this.guestAccessEnabled = guestAccessEnabled;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -1,29 +1,18 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Sensor;
import com.google.gson.annotations.SerializedName;
import java.math.BigDecimal;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SensorSaveRequest {
/** Type of sensor, i.e. of the thing the sensor measures. */
public enum SensorType {
/** A sensor that measures temperature in degrees celsius */
@SerializedName("TEMPERATURE")
TEMPERATURE,
/** A sensor that measures relative humidity in percentage points */
@SerializedName("HUMIDITY")
HUMIDITY,
/** A sensor that measures light in degrees */
@SerializedName("LIGHT")
LIGHT
}
/** The type of this sensor */
@NotNull
@Enumerated(value = EnumType.STRING)
@ -39,36 +28,4 @@ public class SensorSaveRequest {
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull private String name;
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public void setName(String name) {
this.name = name;
}
public Long getRoomId() {
return roomId;
}
public String getName() {
return name;
}
public Sensor.SensorType getSensor() {
return sensor;
}
public void setSensor(Sensor.SensorType sensor) {
this.sensor = sensor;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
}

View File

@ -1,8 +1,10 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.Data;
/** An on/off/toggle operation on a switch */
@Data
public class SwitchOperationRequest {
/** The device id */
@ -16,20 +18,4 @@ public class SwitchOperationRequest {
/** The type of switch operation */
@NotNull private SwitchOperationRequest.OperationType type;
public OperationType getType() {
return type;
}
public void setType(OperationType type) {
this.type = type;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

View File

@ -1,7 +1,13 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SwitchableSaveRequest {
/** The state of this switch */
private boolean on;
@ -17,36 +23,4 @@ public class SwitchableSaveRequest {
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull private String name;
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public Long getRoomId() {
return roomId;
}
public String getName() {
return name;
}
public boolean isOn() {
return on;
}
public void setOn(boolean on) {
this.on = on;
}
public void setId(long id) {
this.id = id;
}
}

View File

@ -1,23 +1,13 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class SwitchableStateSaveRequest {
/** Device id (used only for update requests) */
@NotNull private Long id;
@NotNull private boolean on;
public boolean isOn() {
return on;
}
public void setOn(boolean on) {
this.on = on;
}
public Long getId() {
return id;
}
}

View File

@ -0,0 +1,19 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Thermostat;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatCondition;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class ThermostatConditionSaveRequest {
@NotNull private long id;
@NotNull private Long deviceId;
@NotNull private Long automationId;
@NotNull private ThermostatCondition.Operator operator;
@NotNull private Thermostat.Mode mode;
}

View File

@ -2,7 +2,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import java.math.BigDecimal;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class ThermostatSaveRequest {
/** Device identifier */
@ -22,64 +24,11 @@ public class ThermostatSaveRequest {
@NotNull private boolean useExternalSensors;
@NotNull private BigDecimal measuredTemperature;
/** State of this thermostat */
@NotNull private boolean turnOn;
public boolean isTurnOn() {
return turnOn;
}
/** The value of the error according to this value */
private BigDecimal err;
public void setTurnOn(boolean turnOn) {
this.turnOn = turnOn;
}
public boolean isUseExternalSensors() {
return useExternalSensors;
}
public void setUseExternalSensors(boolean useExternalSensors) {
this.useExternalSensors = useExternalSensors;
}
public BigDecimal getTargetTemperature() {
return this.targetTemperature;
}
public void setTargetTemperature(BigDecimal targetTemperature) {
this.targetTemperature = targetTemperature;
}
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public Long getRoomId() {
return roomId;
}
public String getName() {
return name;
}
public void setId(long id) {
this.id = id;
}
public BigDecimal getMeasuredTemperature() {
return measuredTemperature;
}
public void setMeasuredTemperature(BigDecimal measuredTemperature) {
this.measuredTemperature = measuredTemperature;
}
private BigDecimal typical;
}

View File

@ -1,7 +1,9 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.*;
import lombok.Data;
@Data
public class UserRegistrationRequest {
/** The full name of the user */
@ -35,36 +37,4 @@ public class UserRegistrationRequest {
@Email(message = "Please provide a valid email address")
@Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address")
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@ -0,0 +1,19 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.User;
import lombok.Data;
@Data
public class UserResponse {
private Long id;
private String username;
private String name;
public static UserResponse fromUser(User u) {
final UserResponse us = new UserResponse();
us.name = u.getName();
us.id = u.getId();
us.username = u.getUsername();
return us;
}
}

View File

@ -1,48 +0,0 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
public class UserUpdateRequest {
/** The full name of the user */
@NotEmpty(message = "Please provide a full name")
private String name;
/** A non-salted password */
@NotEmpty(message = "Please provide a password")
private String password;
/**
* The user's email (validated according to criteria used in <code>&gt;input type="email"&lt;>
* </code>, technically not RFC 5322 compliant
*/
@NotEmpty(message = "Please provide an email")
@Email(message = "Please provide a valid email address")
@Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address")
private String email;
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@ -0,0 +1,24 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanCondition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Condition;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
public class BooleanConditionDTO extends ConditionDTO {
@NotNull @Getter @Setter private boolean on;
@Override
public Condition<?> toModel() {
BooleanCondition t = new BooleanCondition();
t.setDeviceId(this.getDeviceId());
t.setOn(this.on);
return t;
}
}

View File

@ -0,0 +1,23 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.BooleanTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Trigger;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
public class BooleanTriggerDTO extends TriggerDTO {
@NotNull @Getter @Setter private boolean on;
@Override
public Trigger<?> toModel() {
BooleanTrigger t = new BooleanTrigger();
t.setDeviceId(this.getDeviceId());
t.setOn(this.on);
return t;
}
}

View File

@ -0,0 +1,12 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Condition;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
public abstract class ConditionDTO {
@NotNull @Getter @Setter private long deviceId;
public abstract Condition<?> toModel();
}

View File

@ -0,0 +1,23 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Condition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Operator;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeCondition;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
public class RangeConditionDTO extends ConditionDTO {
@NotNull @Getter @Setter private Operator operator;
@NotNull @Getter @Setter private double range;
@Override
public Condition<?> toModel() {
RangeCondition t = new RangeCondition();
t.setDeviceId(this.getDeviceId());
t.setOperator(this.operator);
t.setRange(this.range);
return t;
}
}

View File

@ -0,0 +1,22 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Operator;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RangeTrigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Trigger;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
public class RangeTriggerDTO extends TriggerDTO {
@NotNull @Getter @Setter private Operator operator;
@NotNull @Getter @Setter private double range;
@Override
public Trigger<?> toModel() {
RangeTrigger t = new RangeTrigger();
t.setDeviceId(this.getDeviceId());
t.setOperator(this.operator);
t.setRange(this.range);
return t;
}
}

View File

@ -0,0 +1,26 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ScenePriority;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
public class ScenePriorityDTO {
@NotNull @Getter @Setter private long sceneId;
@NotNull
@Min(0)
private @Getter @Setter Integer priority;
public ScenePriority toModel() {
ScenePriority s = new ScenePriority();
s.setSceneId(sceneId);
s.setPriority(priority);
return s;
}
}

View File

@ -0,0 +1,29 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Condition;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Thermostat;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatCondition;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
public class ThermostatConditionDTO extends ConditionDTO {
@NotNull @Getter @Setter private ThermostatCondition.Operator operator;
@NotNull @Getter @Setter private Thermostat.Mode mode;
@Override
public Condition<?> toModel() {
ThermostatCondition t = new ThermostatCondition();
t.setDeviceId(this.getDeviceId());
t.setOperator(this.operator);
t.setMode(this.mode);
return t;
}
}

View File

@ -0,0 +1,13 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.dto.automation;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Trigger;
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Triggerable;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
public abstract class TriggerDTO {
@NotNull @Getter @Setter private long deviceId;
public abstract Trigger<? extends Triggerable> toModel();
}

View File

@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.ResponseStatus;
public class UnauthorizedException extends Exception {
private final boolean isUserDisabled;
public UnauthorizedException(boolean isDisabled) {
super("Access denied: " + (isDisabled ? "user is disabled" : "wrong credentials"));
public UnauthorizedException(boolean isDisabled, Throwable cause) {
super("Access denied: " + (isDisabled ? "user is disabled" : "wrong credentials"), cause);
this.isUserDisabled = isDisabled;
}

View File

@ -6,8 +6,9 @@ import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
@Entity
public class Automation {
@ -17,65 +18,23 @@ public class Automation {
@ApiModelProperty(hidden = true)
private long id;
@ManyToOne
@JoinColumn(name = "user_id", updatable = false, insertable = false)
@GsonExclude
private User user;
@NotNull
@Column(name = "user_id", nullable = false)
@GsonExclude
private Long userId;
@OneToMany(mappedBy = "automation", orphanRemoval = true)
@OneToMany(mappedBy = "automation", orphanRemoval = true, cascade = CascadeType.REMOVE)
private Set<Trigger<?>> triggers = new HashSet<>();
@OneToMany(mappedBy = "automation", cascade = CascadeType.REMOVE)
private Set<ScenePriority> scenes = new HashSet<>();
@NotNull @NotEmpty private String name;
@ManyToOne
@JoinColumn(name = "user_id", updatable = false, insertable = false)
@GsonExclude
private User user;
public long getId() {
return id;
}
@OneToMany(mappedBy = "automation", orphanRemoval = true, cascade = CascadeType.REMOVE)
private Set<Condition<?>> conditions = new HashSet<>();
public void setId(long id) {
this.id = id;
}
@Column(name = "user_id", nullable = false)
@GsonExclude
private Long userId;
public Set<Trigger<?>> getStates() {
return triggers;
}
public Set<ScenePriority> getScenes() {
return scenes;
}
public Set<Trigger<?>> getTriggers() {
return triggers;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
@NotEmpty private String name;
}

View File

@ -7,9 +7,9 @@ import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
public interface AutomationRepository extends CrudRepository<Automation, Long> {
@EntityGraph(attributePaths = {"scenes", "triggers"})
@EntityGraph(attributePaths = {"scenes", "triggers", "conditions"})
List<Automation> findAllByUserId(@Param("userId") long userId);
@EntityGraph(attributePaths = {"scenes", "triggers"})
@EntityGraph(attributePaths = {"scenes", "triggers", "conditions"})
Optional<Automation> findByIdAndUserId(@Param("id") long id, @Param("userId") long userId);
}

View File

@ -0,0 +1,26 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import javax.persistence.Column;
import javax.persistence.Entity;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Entity
@EqualsAndHashCode(callSuper = true)
public class BooleanCondition extends Condition<BooleanTriggerable> {
@Getter
@Setter
@Column(name = "switchable_on")
private boolean on;
public BooleanCondition() {
super("booleanCondition");
}
@Override
public boolean triggered() {
return this.getDevice().readTriggerState() == isOn();
}
}

View File

@ -0,0 +1,9 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import java.util.List;
import org.springframework.data.repository.query.Param;
public interface BooleanConditionRepository extends ConditionRepository<BooleanCondition> {
List<BooleanCondition> findAllByAutomationId(@Param("automationId") long automationId);
}

View File

@ -2,29 +2,21 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import javax.persistence.Column;
import javax.persistence.Entity;
import lombok.Getter;
import lombok.Setter;
@Entity
public class BooleanTrigger<D extends Device & BooleanTriggerable> extends Trigger<D> {
public class BooleanTrigger extends Trigger<BooleanTriggerable> {
@Column(name = "switchable_on")
@Getter
@Setter
private boolean on;
public BooleanTrigger() {
super("booleanTrigger");
}
public boolean isOn() {
return on;
}
public void setOn(boolean on) {
this.on = on;
}
public boolean check(boolean on) {
return this.on == on;
}
@Override
public boolean triggered() {
return getDevice().readTriggerState() == isOn();

View File

@ -3,8 +3,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import java.util.List;
import org.springframework.data.repository.query.Param;
public interface BooleanTriggerRepository
extends TriggerRepository<BooleanTrigger<? extends Device>> {
public interface BooleanTriggerRepository extends TriggerRepository<BooleanTrigger> {
List<BooleanTrigger<?>> findAllByAutomationId(@Param("automationId") long automationId);
List<BooleanTrigger> findAllByAutomationId(@Param("automationId") long automationId);
}

View File

@ -1,5 +1,5 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
public interface BooleanTriggerable {
public interface BooleanTriggerable extends Triggerable {
boolean readTriggerState();
}

View File

@ -18,14 +18,14 @@ public class ButtonDimmer extends Dimmer {
/** Increases the current intensity level of the dimmable light by DIM_INCREMENT */
public void increaseIntensity() {
for (Dimmable dl : getOutputs()) {
for (Dimmable dl : getDimmables()) {
dl.setIntensity(dl.getIntensity() + DIM_INCREMENT);
}
}
/** Decreases the current intensity level of the dimmable light by DIM_INCREMENT */
public void decreaseIntensity() {
for (Dimmable dl : getOutputs()) {
for (Dimmable dl : getDimmables()) {
dl.setIntensity(dl.getIntensity() - DIM_INCREMENT);
}
}

View File

@ -0,0 +1,57 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Condition<D> {
@Transient private String kind;
protected Condition(String kind) {
this.kind = kind;
}
public String getKind() {
return kind;
}
@ManyToOne(targetEntity = Device.class)
@JoinColumn(name = "device_id", updatable = false, insertable = false)
@GsonExclude
private D device;
@Column(name = "automation_id", nullable = false)
private Long automationId;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false, unique = true)
@ApiModelProperty(hidden = true)
private long id;
@ManyToOne
@JoinColumn(name = "automation_id", updatable = false, insertable = false)
@GsonExclude
@EqualsAndHashCode.Exclude
private Automation automation;
/**
* The device this condition belongs to, as a foreign key id. To use when updating and inserting
* from a REST call.
*/
@Column(name = "device_id", nullable = false)
private Long deviceId;
public abstract boolean triggered();
public Condition<D> setAutomationId(Long automationId) {
this.automationId = automationId;
return this;
}
}

View File

@ -0,0 +1,16 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
public interface ConditionRepository<T extends Condition<?>> extends CrudRepository<T, Long> {
List<T> findAllByDeviceId(@Param("deviceId") long deviceId);
List<T> findAllByAutomationId(@Param("automationId") long automationId);
@Transactional
void deleteAllByAutomationId(@Param("automationId") long automationId);
}

View File

@ -1,20 +1,15 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.*;
import lombok.Data;
import lombok.NonNull;
@Data
@Entity
public class ConfirmationToken {
public final class ConfirmationToken {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@ -22,9 +17,18 @@ public class ConfirmationToken {
private Long id;
@Column(name = "confirmation_token", unique = true)
private String confirmationToken;
private String confirmToken;
public Date getCreatedDate() {
return new Date(createdDate.getTime());
}
public void setCreatedDate(Date createdDate) {
this.createdDate = new Date(createdDate.getTime());
}
@Temporal(TemporalType.TIMESTAMP)
@NonNull
private Date createdDate;
@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)
@ -32,55 +36,32 @@ public class ConfirmationToken {
private User user;
@Column(nullable = false)
private Boolean resetPassword;
private boolean resetPassword;
public ConfirmationToken(User user) {
this.user = user;
createdDate = new Date();
confirmationToken = UUID.randomUUID().toString();
confirmToken = UUID.randomUUID().toString();
resetPassword = false;
}
/** Constructor for hibernate reflective stuff things whatever */
public ConfirmationToken() {}
public Long getId() {
return id;
public ConfirmationToken() {
this((User) null);
}
public String getConfirmationToken() {
return confirmationToken;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ConfirmationToken that = (ConfirmationToken) o;
return resetPassword == that.resetPassword
&& confirmToken.equals(that.confirmToken)
&& createdDate.equals(that.createdDate)
&& Objects.equals(user, that.user);
}
public Date getCreatedDate() {
return createdDate;
}
public User getUser() {
return user;
}
public void setId(Long id) {
this.id = id;
}
public void setConfirmationToken(String confirmationToken) {
this.confirmationToken = confirmationToken;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public void setUser(User user) {
this.user = user;
}
public Boolean getResetPassword() {
return resetPassword;
}
public void setResetPassword(Boolean resetPassword) {
this.resetPassword = resetPassword;
@Override
public int hashCode() {
return Objects.hash(confirmToken, createdDate, user, resetPassword);
}
}

View File

@ -4,7 +4,7 @@ import javax.transaction.Transactional;
import org.springframework.data.repository.CrudRepository;
public interface ConfirmationTokenRepository extends CrudRepository<ConfirmationToken, String> {
ConfirmationToken findByConfirmationToken(String confirmationToken);
ConfirmationToken findByConfirmToken(String confirmToken);
ConfirmationToken findByUser(User user);

View File

@ -0,0 +1,5 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
public interface Connectable<O extends OutputDevice> {
void connect(O output, boolean connect);
}

View File

@ -1,47 +0,0 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Function;
/**
* A rule on how to connect an input device type to an output device type
*
* @param <I> the input device type
* @param <O> the output device type
*/
@FunctionalInterface
public interface Connector<I extends InputDevice, O extends OutputDevice> {
/**
* Connects or disconnects input to output
*
* @param input the input device
* @param output the output device
* @param connect true if connection, false if disconnection
*/
void connect(I input, O output, boolean connect);
/**
* Produces a basic implementation of a connector, assuming there is a ManyToMany relationship
* between J and K
*
* @param outputsGetter the getter method of the set of outputs on the input class
* @param inputsGetter the getter method of the set of outputs on the input class
* @param <J> the input device type
* @param <K> the output device type
* @return a Connector implementation for the pair of types J and K
*/
static <J extends InputDevice, K extends OutputDevice> Connector<J, K> basic(
Function<J, Set<? super K>> outputsGetter, Function<K, Set<? super J>> inputsGetter) {
return (i, o, connect) -> {
if (connect) {
outputsGetter.apply(i).add(o);
inputsGetter.apply(o).add(i);
} else {
outputsGetter.apply(i).remove(o);
inputsGetter.apply(o).remove(i);
}
};
}
}

View File

@ -3,8 +3,8 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import javax.persistence.Entity;
/**
* Represents a curtain. The intensity represents how much the curtains are opened,
* 0 is completely closed 100 is completely open
* Represents a curtain. The intensity represents how much the curtains are opened, 0 is completely
* closed 100 is completely open
*/
@Entity
public class Curtains extends Dimmable {

View File

@ -4,13 +4,13 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.SocketGsonExclude;
import com.google.gson.annotations.SerializedName;
import io.swagger.annotations.ApiModelProperty;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import lombok.Data;
/** Generic abstraction for a smart home device */
@Entity
@Data
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Device {
@ -39,18 +39,16 @@ public abstract class Device {
@OneToMany(mappedBy = "device", orphanRemoval = true)
@GsonExclude
@SocketGsonExclude
private Set<Trigger<? extends Device>> triggers = new HashSet<>();
private Set<Trigger<? extends Device>> triggers;
/**
* The room this device belongs in, as a foreign key id. To use when updating and inserting from
* a REST call.
*/
@Column(name = "room_id", nullable = false)
@NotNull
private Long roomId;
/** The name of the device as assigned by the user (e.g. 'Master bedroom light') */
@NotNull
@Column(nullable = false)
private String name;
@ -69,63 +67,15 @@ public abstract class Device {
@OneToMany(mappedBy = "device", orphanRemoval = true)
@GsonExclude
@SocketGsonExclude
private Set<State<?>> states = new HashSet<>();
private Set<State> states;
@Transient @GsonExclude private boolean fromHost = false;
@Transient @GsonExclude private Long fromHostId = null;
@Transient @GsonExclude private boolean fromGuest = false;
@Transient @GsonExclude private boolean deleted = false;
public boolean isFromHost() {
return fromHost;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
public boolean isFromGuest() {
return fromGuest;
}
public void setFromGuest(boolean fromGuest) {
this.fromGuest = fromGuest;
}
public void setFromHost(boolean fromHost) {
this.fromHost = fromHost;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getRoomId() {
return roomId;
}
public void setRoomId(Long roomId) {
this.roomId = roomId;
}
public Device(String kind, FlowType flowType) {
protected Device(String kind, FlowType flowType) {
this.kind = kind;
this.flowType = flowType;
}

View File

@ -2,22 +2,20 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude;
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.SocketGsonExclude;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Entity
@EqualsAndHashCode(callSuper = true)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Dimmable extends Switchable implements RangeTriggerable {
public static final Connector<KnobDimmer, Dimmable> KNOB_DIMMER_DIMMABLE_CONNECTOR =
Connector.basic(KnobDimmer::getOutputs, Dimmable::getDimmers);
public static final Connector<ButtonDimmer, Dimmable> BUTTON_DIMMER_DIMMABLE_CONNECTOR =
Connector.basic(ButtonDimmer::getOutputs, Dimmable::getDimmers);
protected Dimmable(String kind) {
super(kind);
}
@ -25,23 +23,23 @@ public class Dimmable extends Switchable implements RangeTriggerable {
@ManyToMany(mappedBy = "dimmables", cascade = CascadeType.DETACH)
@GsonExclude
@SocketGsonExclude
private Set<Dimmer> dimmers;
@EqualsAndHashCode.Exclude
@Getter
@Setter
private Set<Dimmer> dimmers = new HashSet<>();
/** The light intensity value. Goes from 0 (off) to 100 (on) */
@NotNull
@Column(nullable = false)
@Min(0)
@Max(100)
@Getter
private Integer intensity = 0;
@NotNull
@Column(nullable = false)
@Getter
@Setter
private Integer oldIntensity = 100;
public Integer getIntensity() {
return intensity;
}
/**
* Sets the intensity to a certain level. Out of bound values are corrected to the respective
* extremums. An intensity level of 0 turns the light off, but keeps the old intensity level
@ -71,19 +69,14 @@ public class Dimmable extends Switchable implements RangeTriggerable {
intensity = on ? oldIntensity : 0;
}
public Set<Dimmer> getDimmers() {
return this.dimmers;
}
public void readStateAndSet(DimmableState<? extends Dimmable> state) {
public void readStateAndSet(DimmableState state) {
setIntensity(state.getIntensity());
}
@Override
public State<? extends Dimmable> cloneState() {
final DimmableState<Dimmable> newState = new DimmableState<>();
public State cloneState() {
final DimmableState newState = new DimmableState();
newState.setDeviceId(getId());
newState.setDevice(this);
newState.setIntensity(getIntensity());
return newState;
}

View File

@ -1,6 +1,6 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import javax.persistence.*;
import javax.persistence.Entity;
/** Represent a dimmable light */
@Entity

View File

@ -1,4 +1,3 @@
package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
public interface DimmableRepository<T extends Dimmable> extends SwitchableRepository<T> {
}
public interface DimmableRepository<T extends Dimmable> extends SwitchableRepository<T> {}

View File

@ -3,26 +3,33 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models;
import javax.persistence.Entity;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import lombok.Getter;
import lombok.Setter;
/** Represent a state for an IDimmable device */
@Entity
public class DimmableState<T extends Dimmable> extends State<T> {
public class DimmableState extends State {
public void setDevice(Dimmable device) {
setInnerDevice(device);
}
/** The light intensity value. Goes from 0 (off) to 100 (on) */
@Min(0)
@Max(100)
@Getter
@Setter
private int intensity = 0;
public int getIntensity() {
return intensity;
}
public void setIntensity(int dimAmount) {
this.intensity = dimAmount;
}
@Override
public void apply() {
getDevice().readStateAndSet(this);
((Dimmable) getDevice()).readStateAndSet(this);
}
@Override
protected DimmableState copy() {
final DimmableState d = new DimmableState();
d.setIntensity(intensity);
return d;
}
}

Some files were not shown because too many files have changed in this diff Show More