@@ -2,6 +2,8 @@ package ru.ifmo.se.dating.people.api
2
2
3
3
import kotlinx.coroutines.flow.Flow
4
4
import kotlinx.coroutines.flow.map
5
+ import org.springframework.core.io.ByteArrayResource
6
+ import org.springframework.core.io.Resource
5
7
import org.springframework.http.ResponseEntity
6
8
import org.springframework.stereotype.Controller
7
9
import ru.ifmo.se.dating.exception.AuthorizationException
@@ -11,15 +13,20 @@ import ru.ifmo.se.dating.people.api.generated.PeopleApiDelegate
11
13
import ru.ifmo.se.dating.people.api.mapping.toMessage
12
14
import ru.ifmo.se.dating.people.api.mapping.toModel
13
15
import ru.ifmo.se.dating.people.logic.PersonService
16
+ import ru.ifmo.se.dating.people.logic.PictureService
14
17
import ru.ifmo.se.dating.people.model.Faculty
18
+ import ru.ifmo.se.dating.people.model.Picture
15
19
import ru.ifmo.se.dating.people.model.generated.*
16
20
import ru.ifmo.se.dating.security.auth.User
17
21
import ru.ifmo.se.dating.spring.security.auth.SpringSecurityContext
18
22
import java.time.LocalDate
19
23
import java.time.OffsetDateTime
20
24
21
25
@Controller
22
- class HttpPeopleApi (private val service : PersonService ) : PeopleApiDelegate {
26
+ class HttpPeopleApi (
27
+ private val personService : PersonService ,
28
+ private val pictureService : PictureService ,
29
+ ) : PeopleApiDelegate {
23
30
override fun peopleGet (
24
31
offset : Long ,
25
32
limit : Long ,
@@ -57,7 +64,7 @@ class HttpPeopleApi(private val service: PersonService) : PeopleApiDelegate {
57
64
TODO (" Unsupported GET /people query parameter was provided" )
58
65
}
59
66
60
- return service .getFiltered(
67
+ return personService .getFiltered(
61
68
Page (offset = offset.toInt(), limit = limit.toInt()),
62
69
PersonService .Filter (
63
70
firstName = firstName?.let { Regex (it) } ? : Regex (" .*" ),
@@ -76,13 +83,13 @@ class HttpPeopleApi(private val service: PersonService) : PeopleApiDelegate {
76
83
throw AuthorizationException (" caller $callerId can't delete $targetId " )
77
84
}
78
85
79
- service .delete(targetId)
86
+ personService .delete(targetId)
80
87
81
88
return ResponseEntity .ok(Unit )
82
89
}
83
90
84
91
override suspend fun peoplePersonIdGet (personId : Long ): ResponseEntity <PersonVariantMessage > =
85
- service .getById(User .Id (personId.toInt()))
92
+ personService .getById(User .Id (personId.toInt()))
86
93
?.toMessage()
87
94
.orThrowNotFound(" person with id $personId not found" )
88
95
.let { ResponseEntity .ok(it) }
@@ -95,10 +102,50 @@ class HttpPeopleApi(private val service: PersonService) : PeopleApiDelegate {
95
102
val model = personPatchMessage.toModel(personId.toInt())
96
103
97
104
when (status) {
98
- PersonStatusMessage .draft -> service .edit(model)
99
- PersonStatusMessage .ready -> service .save(model)
105
+ PersonStatusMessage .draft -> personService .edit(model)
106
+ PersonStatusMessage .ready -> personService .save(model)
100
107
}
101
108
102
109
return ResponseEntity .ok(Unit )
103
110
}
111
+
112
+ override suspend fun peoplePersonIdPhotosPost (
113
+ personId : Long ,
114
+ body : Resource ? ,
115
+ ): ResponseEntity <PictureMessage > {
116
+ require(body != null )
117
+
118
+ val callerId = SpringSecurityContext .principal()
119
+ val targetId = User .Id (personId.toInt())
120
+ if (callerId != targetId) {
121
+ throw AuthorizationException (" caller $callerId can't post photo to $targetId profile" )
122
+ }
123
+
124
+ val pictureId = pictureService.save(Picture .Content (body.contentAsByteArray))
125
+
126
+ return PictureMessage (id = pictureId.number.toLong()).let { ResponseEntity .ok(it) }
127
+ }
128
+
129
+ override suspend fun peoplePersonIdPhotosPictureIdGet (
130
+ personId : Long ,
131
+ pictureId : Long ,
132
+ ): ResponseEntity <Resource > {
133
+ val picture = pictureService.getById(Picture .Id (pictureId.toInt()))
134
+ return ByteArrayResource (picture.bytes).let { ResponseEntity .ok(it) }
135
+ }
136
+
137
+ override suspend fun peoplePersonIdPhotosPictureIdDelete (
138
+ personId : Long ,
139
+ pictureId : Long ,
140
+ ): ResponseEntity <Unit > {
141
+ val callerId = SpringSecurityContext .principal()
142
+ val targetId = User .Id (personId.toInt())
143
+ if (callerId != targetId) {
144
+ throw AuthorizationException (" caller $callerId can't remove photo of $targetId profile" )
145
+ }
146
+
147
+ pictureService.remove(Picture .Id (pictureId.toInt()))
148
+
149
+ return ResponseEntity .ok(Unit )
150
+ }
104
151
}
0 commit comments