• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

hyperledger / identus-cloud-agent / 10793991050

10 Sep 2024 01:56PM UTC coverage: 48.504% (-4.5%) from 52.962%
10793991050

push

web-flow
build: sbt and plugins dependency update (#1337)

Signed-off-by: Hyperledger Bot <hyperledger-bot@hyperledger.org>
Signed-off-by: Yurii Shynbuiev <yurii.shynbuiev@iohk.io>
Co-authored-by: Hyperledger Bot <hyperledger-bot@hyperledger.org>
Co-authored-by: Yurii Shynbuiev <yurii.shynbuiev@iohk.io>

7406 of 15269 relevant lines covered (48.5%)

0.49 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/controller/http/ManagedDID.scala
1
package org.hyperledger.identus.castor.controller.http
2

3
import org.hyperledger.identus.agent.walletapi.model.{DIDPublicKeyTemplate, ManagedDIDDetail, PublicationState}
4
import org.hyperledger.identus.agent.walletapi.model as walletDomain
5
import org.hyperledger.identus.api.http.Annotation
6
import org.hyperledger.identus.castor.core.model.did.{EllipticCurve, PrismDID, VerificationRelationship}
7
import org.hyperledger.identus.castor.core.model.did as castorDomain
8
import org.hyperledger.identus.shared.utils.Traverse.*
9
import sttp.tapir.Schema
10
import sttp.tapir.Schema.annotations.{description, encodedExample}
11
import zio.json.{DeriveJsonDecoder, DeriveJsonEncoder, JsonDecoder, JsonEncoder}
12

13
import scala.language.implicitConversions
14

15
final case class ManagedDID(
16
    @description(ManagedDID.annotations.did.description)
×
17
    @encodedExample(ManagedDID.annotations.did.example)
×
18
    did: String,
19
    @description(ManagedDID.annotations.longFormDid.description)
×
20
    @encodedExample(ManagedDID.annotations.longFormDid.example)
×
21
    longFormDid: Option[String] = None,
×
22
    @description(ManagedDID.annotations.status.description)
×
23
    @encodedExample(ManagedDID.annotations.status.example)
×
24
    status: String // TODO: use enum
25
)
26

27
object ManagedDID {
28
  object annotations {
29
    object did
30
        extends Annotation[String](
×
31
          description = "A managed DID",
32
          example = "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff"
33
        )
34

35
    object longFormDid
36
        extends Annotation[String](
×
37
          description =
38
            "A long-form DID. Mandatory when status is not `PUBLISHED` and optional when status is `PUBLISHED`",
39
          example =
40
            "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff:Cr4BCrsBElsKBmF1dGgtMRAEQk8KCXNlY3AyNTZrMRIg0opTuxu-zt6aRbT1tPniG4eu4CYsQPM3rrLzvzNiNgwaIIFTnyT2N4U7qCQ78qtWC3-p0el6Hvv8qxG5uuEw-WgMElwKB21hc3RlcjAQAUJPCglzZWNwMjU2azESIKhBU0eCOO6Vinz_8vhtFSAhYYqrkEXC8PHGxkuIUev8GiAydFHLXb7c22A1Uj_PR21NZp6BCDQqNq2xd244txRgsQ"
41
        )
42

43
    object status
44
        extends Annotation[String](
×
45
          description =
46
            """A status indicating a publication state of a DID in the wallet (e.g. `PUBLICATION_PENDING`, `PUBLISHED`).
×
47
              |Does not represent DID a lifecyle (e.g. `deactivated`, `recovered`, `updated`).""".stripMargin,
×
48
          example = "CREATED"
49
        )
50
  }
51

52
  given encoder: JsonEncoder[ManagedDID] = DeriveJsonEncoder.gen[ManagedDID]
×
53
  given decoder: JsonDecoder[ManagedDID] = DeriveJsonDecoder.gen[ManagedDID]
×
54
  given schema: Schema[ManagedDID] = Schema.derived
×
55

56
  given Conversion[ManagedDIDDetail, ManagedDID] = { didDetail =>
57
    val operation = didDetail.state.createOperation
58
    val (longFormDID, status) = didDetail.state.publicationState match {
×
59
      case PublicationState.Created() => Some(PrismDID.buildLongFormFromOperation(operation)) -> "CREATED"
×
60
      case PublicationState.PublicationPending(_) =>
×
61
        Some(PrismDID.buildLongFormFromOperation(operation)) -> "PUBLICATION_PENDING"
×
62
      case PublicationState.Published(_) => None -> "PUBLISHED"
×
63
    }
64
    ManagedDID(
65
      did = didDetail.did.toString,
×
66
      longFormDid = longFormDID.map(_.toString),
×
67
      status = status
68
    )
69
  }
70
}
71

72
final case class ManagedDIDPage(
73
    self: String,
74
    kind: String = "ManagedDIDPage",
×
75
    pageOf: String,
76
    next: Option[String] = None,
×
77
    previous: Option[String] = None,
×
78
    contents: Seq[ManagedDID]
79
)
80

81
object ManagedDIDPage {
82
  given encoder: JsonEncoder[ManagedDIDPage] = DeriveJsonEncoder.gen[ManagedDIDPage]
×
83
  given decoder: JsonDecoder[ManagedDIDPage] = DeriveJsonDecoder.gen[ManagedDIDPage]
×
84
  given schema: Schema[ManagedDIDPage] = Schema.derived
×
85
}
86

87
final case class CreateManagedDidRequest(
88
    documentTemplate: CreateManagedDidRequestDocumentTemplate
89
)
90

91
object CreateManagedDidRequest {
92
  given encoder: JsonEncoder[CreateManagedDidRequest] = DeriveJsonEncoder.gen[CreateManagedDidRequest]
×
93
  given decoder: JsonDecoder[CreateManagedDidRequest] = DeriveJsonDecoder.gen[CreateManagedDidRequest]
×
94
  given schema: Schema[CreateManagedDidRequest] = Schema.derived
×
95
}
96

97
final case class CreateManagedDidRequestDocumentTemplate(
98
    publicKeys: Seq[ManagedDIDKeyTemplate],
99
    services: Seq[Service],
100
    contexts: Option[Seq[Context]]
101
)
102

103
object CreateManagedDidRequestDocumentTemplate {
104
  given encoder: JsonEncoder[CreateManagedDidRequestDocumentTemplate] =
105
    DeriveJsonEncoder.gen[CreateManagedDidRequestDocumentTemplate]
×
106
  given decoder: JsonDecoder[CreateManagedDidRequestDocumentTemplate] =
107
    DeriveJsonDecoder.gen[CreateManagedDidRequestDocumentTemplate]
×
108
  given schema: Schema[CreateManagedDidRequestDocumentTemplate] = Schema.derived
×
109

110
  extension (template: CreateManagedDidRequestDocumentTemplate) {
111
    def toDomain: Either[String, walletDomain.ManagedDIDTemplate] = {
×
112
      for {
×
113
        services <- template.services.traverse(_.toDomain)
×
114
        publicKeys = template.publicKeys.map[DIDPublicKeyTemplate](k => k)
×
115
      } yield walletDomain.ManagedDIDTemplate(
×
116
        publicKeys = publicKeys,
117
        services = services,
118
        contexts = template.contexts.getOrElse(Nil).map(_.value)
×
119
      )
120
    }
121
  }
122
}
123

124
class Context(val value: String) extends AnyVal
125

126
object Context {
127
  given Conversion[Context, String] = _.value
128
  given Conversion[String, Context] = Context(_)
×
129

130
  given encoder: JsonEncoder[Context] = JsonEncoder[String].contramap(_.value)
×
131
  given decoder: JsonDecoder[Context] = JsonDecoder[String].map(Context(_))
×
132
  given schema: Schema[Context] = Schema
133
    .string[Context]
×
134
    .description("The JSON-LD context describing the JSON document")
×
135
    .encodedExample("https://didcomm.org/messaging/contexts/v2")
×
136
}
137

138
enum Purpose {
139
  case authentication extends Purpose
140
  case assertionMethod extends Purpose
141
  case keyAgreement extends Purpose
142
  case capabilityInvocation extends Purpose
143
  case capabilityDelegation extends Purpose
144
}
145

146
object Purpose {
147
  given Conversion[Purpose, VerificationRelationship] = {
148
    case Purpose.authentication       => VerificationRelationship.Authentication
×
149
    case Purpose.assertionMethod      => VerificationRelationship.AssertionMethod
×
150
    case Purpose.keyAgreement         => VerificationRelationship.KeyAgreement
×
151
    case Purpose.capabilityInvocation => VerificationRelationship.CapabilityInvocation
×
152
    case Purpose.capabilityDelegation => VerificationRelationship.CapabilityDelegation
×
153
  }
154

155
  given Conversion[VerificationRelationship, Purpose] = {
156
    case VerificationRelationship.Authentication       => Purpose.authentication
×
157
    case VerificationRelationship.AssertionMethod      => Purpose.assertionMethod
×
158
    case VerificationRelationship.KeyAgreement         => Purpose.keyAgreement
×
159
    case VerificationRelationship.CapabilityInvocation => Purpose.capabilityInvocation
×
160
    case VerificationRelationship.CapabilityDelegation => Purpose.capabilityDelegation
×
161
  }
162

163
  given encoder: JsonEncoder[Purpose] = JsonEncoder[String].contramap(_.toString)
×
164
  given decoder: JsonDecoder[Purpose] =
165
    JsonDecoder[String].mapOrFail(s => Purpose.values.find(_.toString == s).toRight(s"Unknown purpose: $s"))
×
166
  given schema: Schema[Purpose] = Schema.derivedEnumeration.defaultStringBased
×
167
}
168

169
enum Curve {
170
  case secp256k1 extends Curve
171
  case Ed25519 extends Curve
172
  case X25519 extends Curve
173
}
174

175
object Curve {
176
  given Conversion[Curve, EllipticCurve] = {
177
    case Curve.secp256k1 => EllipticCurve.SECP256K1
×
178
    case Curve.Ed25519   => EllipticCurve.ED25519
×
179
    case Curve.X25519    => EllipticCurve.X25519
×
180
  }
181

182
  given Conversion[EllipticCurve, Curve] = {
183
    case EllipticCurve.SECP256K1 => Curve.secp256k1
×
184
    case EllipticCurve.ED25519   => Curve.Ed25519
×
185
    case EllipticCurve.X25519    => Curve.X25519
×
186
  }
187

188
  given encoder: JsonEncoder[Curve] = JsonEncoder[String].contramap(_.toString)
×
189
  given decoder: JsonDecoder[Curve] =
190
    JsonDecoder[String].mapOrFail(s => Curve.values.find(_.toString == s).toRight(s"Unknown curve: $s"))
×
191
  given schema: Schema[Curve] = Schema.derivedEnumeration.defaultStringBased
×
192
}
193

194
@description("A key-pair template to add to DID document.")
×
195
final case class ManagedDIDKeyTemplate(
196
    @description(ManagedDIDKeyTemplate.annotations.id.description)
×
197
    @encodedExample(ManagedDIDKeyTemplate.annotations.id.example)
×
198
    id: String,
199
    @description(ManagedDIDKeyTemplate.annotations.purpose.description)
×
200
    @encodedExample(ManagedDIDKeyTemplate.annotations.purpose.example)
×
201
    purpose: Purpose,
202
    @description(ManagedDIDKeyTemplate.annotations.curve.description)
×
203
    @encodedExample(ManagedDIDKeyTemplate.annotations.curve.example)
×
204
    curve: Option[Curve]
205
)
206

207
object ManagedDIDKeyTemplate {
208
  object annotations {
209
    object id
210
        extends Annotation[String](
211
          description = "Identifier of a verification material in the DID Document",
212
          example = "key-1"
213
        )
214

215
    object purpose
216
        extends Annotation[Purpose](
×
217
          description = "Purpose of the verification material in the DID Document",
218
          example = VerificationRelationship.Authentication
×
219
        )
220

221
    object curve
222
        extends Annotation[Option[Curve]](
×
223
          description =
224
            "The curve name of the verification material in the DID Document. Defaults to `secp256k1` if not specified.",
225
          example = Some(Curve.Ed25519)
226
        )
227
  }
228

229
  given encoder: JsonEncoder[ManagedDIDKeyTemplate] = DeriveJsonEncoder.gen[ManagedDIDKeyTemplate]
×
230
  given decoder: JsonDecoder[ManagedDIDKeyTemplate] = DeriveJsonDecoder.gen[ManagedDIDKeyTemplate]
×
231
  given schema: Schema[ManagedDIDKeyTemplate] = Schema.derived
×
232

233
  given Conversion[ManagedDIDKeyTemplate, walletDomain.DIDPublicKeyTemplate] = publicKeyTemplate =>
234
    walletDomain.DIDPublicKeyTemplate(
235
      id = publicKeyTemplate.id,
236
      purpose = publicKeyTemplate.purpose,
×
237
      curve = publicKeyTemplate.curve.getOrElse(Curve.secp256k1)
×
238
    )
239
}
240

241
final case class CreateManagedDIDResponse(
242
    @description(CreateManagedDIDResponse.annotations.longFormDid.description)
×
243
    @encodedExample(CreateManagedDIDResponse.annotations.longFormDid.example)
×
244
    longFormDid: String
245
)
246

247
object CreateManagedDIDResponse {
248
  object annotations {
249
    object longFormDid
250
        extends Annotation[String](
×
251
          description = "A long-form DID for the created DID",
252
          example =
253
            "did:prism:4a5b5cf0a513e83b598bbea25cd6196746747f361a73ef77068268bc9bd732ff:Cr4BCrsBElsKBmF1dGgtMRAEQk8KCXNlY3AyNTZrMRIg0opTuxu-zt6aRbT1tPniG4eu4CYsQPM3rrLzvzNiNgwaIIFTnyT2N4U7qCQ78qtWC3-p0el6Hvv8qxG5uuEw-WgMElwKB21hc3RlcjAQAUJPCglzZWNwMjU2azESIKhBU0eCOO6Vinz_8vhtFSAhYYqrkEXC8PHGxkuIUev8GiAydFHLXb7c22A1Uj_PR21NZp6BCDQqNq2xd244txRgsQ"
254
        )
255
  }
256

257
  given encoder: JsonEncoder[CreateManagedDIDResponse] = DeriveJsonEncoder.gen[CreateManagedDIDResponse]
×
258
  given decoder: JsonDecoder[CreateManagedDIDResponse] = DeriveJsonDecoder.gen[CreateManagedDIDResponse]
×
259
  given schema: Schema[CreateManagedDIDResponse] = Schema.derived
×
260
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc