forked from carlos-verdes/zio-arangodb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArangoCollection.scala
125 lines (96 loc) · 4.34 KB
/
ArangoCollection.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Copyright 2022 Carlos Verdes
*
* SPDX-License-Identifier: MIT
*/
package io.funkode.arangodb
import zio.*
import model.*
import protocol.*
class ArangoCollection[Encoder[_], Decoder[_]](databaseName: DatabaseName, collectionName: CollectionName)(
using arangoClient: ArangoClient[Encoder, Decoder]
):
import ArangoMessage.*
val database: DatabaseName = databaseName
val name: CollectionName = collectionName
val path = ApiCollectionPath.addPart(name.unwrap)
def info(using Decoder[CollectionInfo]): AIO[CollectionInfo] =
GET(database, path).execute
def checksum(withRevisions: Boolean = false, withData: Boolean = false)(using
Decoder[CollectionChecksum]
): AIO[CollectionChecksum] =
GET(
database,
path.addPart("checksum"),
Map(
"withRevisions" -> withRevisions.toString,
"withData" -> withData.toString
)
).execute
def create(setup: CollectionCreate => CollectionCreate = identity)(using
Encoder[CollectionCreate],
Decoder[CollectionInfo]
): AIO[ArangoCollection[Encoder, Decoder]] =
val options = setup(CollectionCreate(name))
POST(database, ApiCollectionPath, options.parameters).withBody(options).execute.map(_ => this)
def createIfNotExist(setup: CollectionCreate => CollectionCreate = identity)(using
Encoder[CollectionCreate],
Decoder[CollectionInfo]
): AIO[ArangoCollection[Encoder, Decoder]] =
create(setup).ifConflict(ZIO.succeed(this))
def createEdge(setup: CollectionCreate => CollectionCreate = identity)(using
Encoder[CollectionCreate],
Decoder[CollectionInfo]
): AIO[ArangoCollection[Encoder, Decoder]] =
val options = setup(CollectionCreate(name, `type` = CollectionType.Edge))
POST(database, ApiCollectionPath, options.parameters).withBody(options).execute.map(_ => this)
def createEdgeIfNotExist(setup: CollectionCreate => CollectionCreate = identity)(using
Encoder[CollectionCreate],
Decoder[CollectionInfo]
): AIO[ArangoCollection[Encoder, Decoder]] =
createEdge(setup).ifConflict(ZIO.succeed(this))
def drop(isSystem: Boolean = false)(using D: Decoder[DeleteResult]): AIO[DeleteResult] =
DELETE(database, path).execute
/*
def revision(): F[ArangoResponse[CollectionRevision]]
def properties(): F[ArangoResponse[CollectionProperties]]
def update(waitForSync: Option[Boolean] = None,
schema: Option[CollectionSchema] = None): F[ArangoResponse[CollectionProperties]]
def truncate(waitForSync: Boolean = false, compact: Boolean = true): F[ArangoResponse[CollectionInfo]]
def rename(newName: CollectionName): F[ArangoResponse[CollectionInfo]]
*/
def documents: ArangoDocuments[Encoder, Decoder] =
new ArangoDocuments[Encoder, Decoder](databaseName, collectionName)
def document(key: DocumentKey): ArangoDocument[Encoder, Decoder] =
new ArangoDocument[Encoder, Decoder](databaseName, DocumentHandle(this.name, key))
/*
def indexes: ArangoIndexes[F]
def index(id: String): ArangoIndex[F]
def all: ArangoQuery[F, VObject]
*/
object ArangoCollection:
extension [R, Enc[_], Dec[_]](colService: ZIO[R, ArangoError, ArangoCollection[Enc, Dec]])
def create(setup: CollectionCreate => CollectionCreate = identity)(using
Enc[CollectionCreate],
Dec[CollectionInfo]
): ZIO[R, ArangoError, ArangoCollection[Enc, Dec]] =
colService.flatMap(_.create(setup))
def createIfNotExist(setup: CollectionCreate => CollectionCreate = identity)(using
Enc[CollectionCreate],
Dec[CollectionInfo]
): ZIO[R, ArangoError, ArangoCollection[Enc, Dec]] =
colService.flatMap(_.createIfNotExist(setup))
def createEdge(setup: CollectionCreate => CollectionCreate = identity)(using
Enc[CollectionCreate],
Dec[CollectionInfo]
): ZIO[R, ArangoError, ArangoCollection[Enc, Dec]] =
colService.flatMap(_.createEdge(setup))
def createEdgeIfNotExist(setup: CollectionCreate => CollectionCreate = identity)(using
Enc[CollectionCreate],
Dec[CollectionInfo]
): ZIO[R, ArangoError, ArangoCollection[Enc, Dec]] =
colService.flatMap(_.createEdgeIfNotExist(setup))
def drop(isSystem: Boolean = false)(using D: Dec[DeleteResult]): ZIO[R, ArangoError, DeleteResult] =
colService.flatMap(_.drop(isSystem))
def documents: ZIO[R, ArangoError, ArangoDocuments[Enc, Dec]] =
colService.map(_.documents)