Skip to content

Commit 1882ccf

Browse files
committed
feat: add couch-db adapter
1 parent 9c42b0b commit 1882ccf

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ spec:
2626

2727
- mongo :white_check_mark:
2828
- mysql :hammer:
29-
- couchdb :hammer:
29+
- couchdb :white_check_mark:
3030
- postgres :clock1:
3131

3232
## Installation

adapters/couchdb_adapter.go

+62-9
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,98 @@
11
package adapters
22

33
import (
4+
"fmt"
5+
46
"github.com/leesper/couchdb-golang"
57
)
68

9+
type securityConfig struct{
10+
names []string
11+
roles []string
12+
}
13+
714
type couchdbAdapter struct {
815
db *couchdb.Server
916
}
1017

1118
func (adapter couchdbAdapter) HasDatabase(database string) (bool, error) {
12-
return false, nil
19+
return adapter.db.Contains(database), nil
1320
}
1421

1522
func (adapter couchdbAdapter) CreateDatabase(database string) error {
16-
// TODO create if not exists
1723
_, err := adapter.db.Create(database)
1824
return err
1925
}
2026

2127
func (adapter couchdbAdapter) DeleteDatabase(database string) error {
22-
// TODO delete if exists
2328
return adapter.db.Delete(database)
2429
}
2530

31+
func (adapter couchdbAdapter) getDatabaseAdmins(database string) ([]string, error) {
32+
db, err := adapter.db.Get(database)
33+
if err != nil {
34+
return nil, err
35+
}
36+
37+
sc, err := db.GetSecurity()
38+
if err != nil {
39+
return nil, err
40+
}
41+
42+
admins, ok := sc["admins"].(securityConfig)
43+
if !ok {
44+
return nil, fmt.Errorf("can't find admin users in security context")
45+
}
46+
47+
return admins.names, nil
48+
}
49+
2650
func (adapter couchdbAdapter) HasDatabaseUserWithAccess(username string, database string) (bool, error) {
27-
// TODO implement
51+
admins, err := adapter.getDatabaseAdmins(database)
52+
if err != nil {
53+
return false, err
54+
}
55+
56+
for _, name := range admins {
57+
if name == username {
58+
return true, nil
59+
}
60+
}
61+
2862
return false, nil
2963
}
3064

3165
func (adapter couchdbAdapter) CreateDatabaseUser(database string, username string, password string) error {
32-
// TODO implement
33-
return nil
66+
adapter.db.AddUser(username, password, nil)
67+
db, err := adapter.db.Get(database)
68+
if err != nil {
69+
return err
70+
}
71+
72+
sc, err := db.GetSecurity()
73+
if err != nil {
74+
return err
75+
}
76+
77+
admins, err := adapter.getDatabaseAdmins(database)
78+
if err != nil {
79+
return err
80+
}
81+
82+
sc["admins"] = &securityConfig{
83+
names: append(admins, username),
84+
roles: nil,
85+
}
86+
87+
return db.SetSecurity(sc)
3488
}
3589

3690
func (adapter couchdbAdapter) DeleteDatabaseUser(database string, username string) error {
37-
// TODO implement
38-
return nil
91+
return adapter.db.RemoveUser(username)
3992
}
4093

4194
func (adapter couchdbAdapter) Close() error {
42-
// TODO implement
95+
// couchdb is using single http calls and has no active connection we could close
4396
return nil
4497
}
4598

0 commit comments

Comments
 (0)