-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSubscriptionsController.kt
More file actions
119 lines (108 loc) · 4.72 KB
/
Copy pathSubscriptionsController.kt
File metadata and controls
119 lines (108 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.genspectrum.dashboardsbackend.controller
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import org.genspectrum.dashboardsbackend.api.Subscription
import org.genspectrum.dashboardsbackend.api.SubscriptionRequest
import org.genspectrum.dashboardsbackend.api.SubscriptionUpdate
import org.genspectrum.dashboardsbackend.api.TriggerEvaluationResponse
import org.genspectrum.dashboardsbackend.model.subscription.SubscriptionModel
import org.genspectrum.dashboardsbackend.model.triggerevaluation.TriggerEvaluationModel
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
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.RequestParam
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
// TODO: Remove once subscriptions are ready for prod (https://github.com/GenSpectrum/dashboards/issues/1163)
@ConditionalOnProperty(name = ["dashboards.features.subscriptions.enabled"], matchIfMissing = true)
@RestController
class SubscriptionsController(
private val subscriptionModel: SubscriptionModel,
private val triggerEvaluationModel: TriggerEvaluationModel,
) {
@GetMapping("/subscriptions/{id}", produces = [MediaType.APPLICATION_JSON_VALUE])
@Operation(
summary = "Get a subscription",
description = "Gets a specific subscription of a user by its uuid.",
)
fun getSubscription(
@IdParameter @PathVariable id: String,
@UserIdParameter @RequestParam userId: Long,
): Subscription = subscriptionModel.getSubscription(
subscriptionId = id,
userId = userId,
)
@GetMapping("/subscriptions", produces = [MediaType.APPLICATION_JSON_VALUE])
@Operation(
summary = "Get all subscriptions of a user",
description = "Returns a list of all subscriptions of a user.",
)
fun getSubscriptions(@UserIdParameter @RequestParam userId: Long): List<Subscription> =
subscriptionModel.getSubscriptions(userId)
@PostMapping("/subscriptions")
@ResponseStatus(HttpStatus.CREATED)
@Operation(
summary = "Create a new subscription",
description = "Creates a new subscription for a user.",
)
fun postSubscriptions(
@RequestBody subscription: SubscriptionRequest,
@UserIdParameter @RequestParam userId: Long,
): Subscription = subscriptionModel.postSubscriptions(
request = subscription,
userId = userId,
)
@DeleteMapping("/subscriptions/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@Operation(
summary = "Delete a subscription",
description = "Deletes a specific subscription of a user by its uuid.",
)
fun deleteSubscription(@IdParameter @PathVariable id: String, @UserIdParameter @RequestParam userId: Long) {
subscriptionModel.deleteSubscription(
subscriptionId = id,
userId = userId,
)
}
@PutMapping("/subscriptions/{id}")
@Operation(
summary = "Update a subscription",
description = "Updates a specific subscription of a user by its uuid.",
)
fun putSubscription(
@RequestBody subscription: SubscriptionUpdate,
@IdParameter @PathVariable id: String,
@UserIdParameter @RequestParam userId: Long,
): Subscription = subscriptionModel.putSubscription(
subscriptionId = id,
subscriptionUpdate = subscription,
userId = userId,
)
@GetMapping("/subscriptions/evaluateTrigger")
@Operation(
summary = "Evaluate the trigger of a subscription",
description = "Evaluates the trigger of a given subscription and returns the result.",
)
fun evaluateTrigger(
@IdParameter @RequestParam id: String,
@UserIdParameter @RequestParam userId: Long,
): TriggerEvaluationResponse {
val triggerEvaluationResult = triggerEvaluationModel.evaluateSubscriptionTrigger(
subscriptionId = id,
userId = userId,
)
return TriggerEvaluationResponse(
result = triggerEvaluationResult,
)
}
}
@Parameter(description = "The (UU)ID of the subscription", example = "123e4567-e89b-12d3-a456-426614174000")
annotation class IdParameter
@Parameter(description = "The ID of the user")
annotation class UserIdParameter