/
Role.scala
95 lines (85 loc) · 2.97 KB
/
Role.scala
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
/*
* Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors.
* SPDX-License-Identifier: Apache-2.0
*/
package dsp.valueobjects
import dsp.errors.BadRequestException
import dsp.valueobjects.LanguageCode
import zio.prelude.Validation
object Role {
/**
* LangString value object.
*
* @param value the [[String]] the value to be validated
* @param isoCode the language ISO code to be validated
*/
sealed abstract case class LangString private (value: String, isoCode: String)
object LangString {
def isIsoCodeSupported(isoCode: String): Boolean =
LanguageCode.SupportedLanguageCodes.contains(isoCode.toLowerCase) // should only lower case be supported?
def make(value: String, isoCode: String): Validation[Throwable, LangString] =
if (value.isEmpty) {
Validation.fail(
BadRequestException(RoleErrorMessages.LangStringValueMissing)
)
} else if (isoCode.isEmpty) {
Validation.fail(
BadRequestException(RoleErrorMessages.LangStringIsoCodeMissing)
)
} else if (!isIsoCodeSupported(isoCode)) {
Validation.fail(
BadRequestException(RoleErrorMessages.LangStringIsoCodeInvalid(isoCode))
)
} else {
val validatedValue = Validation(
V2IriValidation.toSparqlEncodedString(
value,
throw BadRequestException(RoleErrorMessages.LangStringValueInvalid(value))
)
)
validatedValue.map(new LangString(_, isoCode) {})
}
}
}
/**
* Permission value object.
*
* @param value the value to be validated
*/
sealed abstract case class Permission private (value: String)
object Permission {
val View: String = "view"
val Create: String = "create"
val Modify: String = "modify"
val Delete: String = "delete"
val Admin: String = "admin"
val availablePermissions: Set[String] = Set(
View,
Create,
Modify,
Delete,
Admin
)
def isPermissionAvailable(permission: String): Boolean =
availablePermissions.contains(permission.toLowerCase)
def make(value: String): Validation[Throwable, Permission] =
if (value.isEmpty) {
Validation.fail(
BadRequestException(RoleErrorMessages.PermissionMissing)
)
} else if (!isPermissionAvailable(value)) {
Validation.fail(
BadRequestException(RoleErrorMessages.PermissionInvalid(value))
)
} else {
Validation.succeed(new Permission(value) {})
}
}
object RoleErrorMessages {
val LangStringValueMissing = "Value cannot be empty."
val LangStringValueInvalid = (value: String) => s"String value: $value is invalid."
val LangStringIsoCodeMissing = "Language ISO code cannot be empty."
val LangStringIsoCodeInvalid = (isoCode: String) => s"Language ISO code: $isoCode is not suporrted."
val PermissionMissing = "Permission cannot be empty."
val PermissionInvalid = (value: String) => s"Permission: $value is invalid."
}