DataStore is interface now. Liskov would be proud.

This commit is contained in:
Pijus Kamandulis
2025-03-09 18:34:07 +02:00
parent bd4fe5abec
commit 221f029a1d
41 changed files with 836 additions and 747 deletions

View File

@@ -5,7 +5,7 @@ import (
"encoding/json"
"strings"
repositorymodels "github.com/pikami/cosmium/internal/repository_models"
"github.com/pikami/cosmium/internal/datastore"
)
//export CreateCollection
@@ -20,15 +20,15 @@ func CreateCollection(serverName *C.char, databaseId *C.char, collectionJson *C.
return ResponseServerInstanceNotFound
}
var collection repositorymodels.Collection
var collection datastore.Collection
err := json.NewDecoder(strings.NewReader(collectionStr)).Decode(&collection)
if err != nil {
return ResponseFailedToParseRequest
}
_, code := serverInstance.repository.CreateCollection(databaseIdStr, collection)
_, code := serverInstance.dataStore.CreateCollection(databaseIdStr, collection)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}
//export GetCollection
@@ -43,8 +43,8 @@ func GetCollection(serverName *C.char, databaseId *C.char, collectionId *C.char)
return C.CString("")
}
collection, code := serverInstance.repository.GetCollection(databaseIdStr, collectionIdStr)
if code != repositorymodels.StatusOk {
collection, code := serverInstance.dataStore.GetCollection(databaseIdStr, collectionIdStr)
if code != datastore.StatusOk {
return C.CString("")
}
@@ -66,8 +66,8 @@ func GetAllCollections(serverName *C.char, databaseId *C.char) *C.char {
return C.CString("")
}
collections, code := serverInstance.repository.GetAllCollections(databaseIdStr)
if code != repositorymodels.StatusOk {
collections, code := serverInstance.dataStore.GetAllCollections(databaseIdStr)
if code != datastore.StatusOk {
return C.CString("")
}
@@ -90,7 +90,7 @@ func DeleteCollection(serverName *C.char, databaseId *C.char, collectionId *C.ch
return ResponseServerInstanceNotFound
}
code := serverInstance.repository.DeleteCollection(databaseIdStr, collectionIdStr)
code := serverInstance.dataStore.DeleteCollection(databaseIdStr, collectionIdStr)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}

View File

@@ -5,7 +5,7 @@ import (
"encoding/json"
"strings"
repositorymodels "github.com/pikami/cosmium/internal/repository_models"
"github.com/pikami/cosmium/internal/datastore"
)
//export CreateDatabase
@@ -19,15 +19,15 @@ func CreateDatabase(serverName *C.char, databaseJson *C.char) int {
return ResponseServerInstanceNotFound
}
var database repositorymodels.Database
var database datastore.Database
err := json.NewDecoder(strings.NewReader(databaseStr)).Decode(&database)
if err != nil {
return ResponseFailedToParseRequest
}
_, code := serverInstance.repository.CreateDatabase(database)
_, code := serverInstance.dataStore.CreateDatabase(database)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}
//export GetDatabase
@@ -41,8 +41,8 @@ func GetDatabase(serverName *C.char, databaseId *C.char) *C.char {
return C.CString("")
}
database, code := serverInstance.repository.GetDatabase(databaseIdStr)
if code != repositorymodels.StatusOk {
database, code := serverInstance.dataStore.GetDatabase(databaseIdStr)
if code != datastore.StatusOk {
return C.CString("")
}
@@ -63,8 +63,8 @@ func GetAllDatabases(serverName *C.char) *C.char {
return C.CString("")
}
databases, code := serverInstance.repository.GetAllDatabases()
if code != repositorymodels.StatusOk {
databases, code := serverInstance.dataStore.GetAllDatabases()
if code != datastore.StatusOk {
return C.CString("")
}
@@ -87,7 +87,7 @@ func DeleteDatabase(serverName *C.char, databaseId *C.char) int {
return ResponseServerInstanceNotFound
}
code := serverInstance.repository.DeleteDatabase(databaseIdStr)
code := serverInstance.dataStore.DeleteDatabase(databaseIdStr)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}

View File

@@ -5,7 +5,7 @@ import (
"encoding/json"
"strings"
repositorymodels "github.com/pikami/cosmium/internal/repository_models"
"github.com/pikami/cosmium/internal/datastore"
)
//export CreateDocument
@@ -21,15 +21,15 @@ func CreateDocument(serverName *C.char, databaseId *C.char, collectionId *C.char
return ResponseServerInstanceNotFound
}
var document repositorymodels.Document
var document datastore.Document
err := json.NewDecoder(strings.NewReader(documentStr)).Decode(&document)
if err != nil {
return ResponseFailedToParseRequest
}
_, code := serverInstance.repository.CreateDocument(databaseIdStr, collectionIdStr, document)
_, code := serverInstance.dataStore.CreateDocument(databaseIdStr, collectionIdStr, document)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}
//export GetDocument
@@ -45,8 +45,8 @@ func GetDocument(serverName *C.char, databaseId *C.char, collectionId *C.char, d
return C.CString("")
}
document, code := serverInstance.repository.GetDocument(databaseIdStr, collectionIdStr, documentIdStr)
if code != repositorymodels.StatusOk {
document, code := serverInstance.dataStore.GetDocument(databaseIdStr, collectionIdStr, documentIdStr)
if code != datastore.StatusOk {
return C.CString("")
}
@@ -69,8 +69,8 @@ func GetAllDocuments(serverName *C.char, databaseId *C.char, collectionId *C.cha
return C.CString("")
}
documents, code := serverInstance.repository.GetAllDocuments(databaseIdStr, collectionIdStr)
if code != repositorymodels.StatusOk {
documents, code := serverInstance.dataStore.GetAllDocuments(databaseIdStr, collectionIdStr)
if code != datastore.StatusOk {
return C.CString("")
}
@@ -95,19 +95,19 @@ func UpdateDocument(serverName *C.char, databaseId *C.char, collectionId *C.char
return ResponseServerInstanceNotFound
}
var document repositorymodels.Document
var document datastore.Document
err := json.Unmarshal([]byte(documentStr), &document)
if err != nil {
return ResponseFailedToParseRequest
}
code := serverInstance.repository.DeleteDocument(databaseIdStr, collectionIdStr, documentIdStr)
if code != repositorymodels.StatusOk {
return repositoryStatusToResponseCode(code)
code := serverInstance.dataStore.DeleteDocument(databaseIdStr, collectionIdStr, documentIdStr)
if code != datastore.StatusOk {
return dataStoreStatusToResponseCode(code)
}
_, code = serverInstance.repository.CreateDocument(databaseIdStr, collectionIdStr, document)
return repositoryStatusToResponseCode(code)
_, code = serverInstance.dataStore.CreateDocument(databaseIdStr, collectionIdStr, document)
return dataStoreStatusToResponseCode(code)
}
//export DeleteDocument
@@ -123,7 +123,7 @@ func DeleteDocument(serverName *C.char, databaseId *C.char, collectionId *C.char
return ResponseServerInstanceNotFound
}
code := serverInstance.repository.DeleteDocument(databaseIdStr, collectionIdStr, documentIdStr)
code := serverInstance.dataStore.DeleteDocument(databaseIdStr, collectionIdStr, documentIdStr)
return repositoryStatusToResponseCode(code)
return dataStoreStatusToResponseCode(code)
}

View File

@@ -4,13 +4,12 @@ import (
"sync"
"github.com/pikami/cosmium/api"
"github.com/pikami/cosmium/internal/repositories"
repositorymodels "github.com/pikami/cosmium/internal/repository_models"
"github.com/pikami/cosmium/internal/datastore"
)
type ServerInstance struct {
server *api.ApiServer
repository *repositories.DataRepository
server *api.ApiServer
dataStore datastore.DataStore
}
var (
@@ -21,17 +20,18 @@ var (
const (
ResponseSuccess = 0
ResponseUnknown = 100
ResponseFailedToParseConfiguration = 101
ResponseFailedToLoadState = 102
ResponseFailedToParseRequest = 103
ResponseServerInstanceAlreadyExists = 104
ResponseServerInstanceNotFound = 105
ResponseFailedToStartServer = 106
ResponseUnknown = 100
ResponseFailedToParseConfiguration = 101
ResponseFailedToLoadState = 102
ResponseFailedToParseRequest = 103
ResponseServerInstanceAlreadyExists = 104
ResponseServerInstanceNotFound = 105
ResponseFailedToStartServer = 106
ResponseCurentDataStoreDoesNotSupportStateLoading = 107
ResponseRepositoryNotFound = 200
ResponseRepositoryConflict = 201
ResponseRepositoryBadRequest = 202
ResponseDataStoreNotFound = 200
ResponseDataStoreConflict = 201
ResponseDataStoreBadRequest = 202
)
func getInstance(serverName string) (*ServerInstance, bool) {
@@ -61,16 +61,16 @@ func removeInstance(serverName string) {
delete(serverInstances, serverName)
}
func repositoryStatusToResponseCode(status repositorymodels.RepositoryStatus) int {
func dataStoreStatusToResponseCode(status datastore.DataStoreStatus) int {
switch status {
case repositorymodels.StatusOk:
case datastore.StatusOk:
return ResponseSuccess
case repositorymodels.StatusNotFound:
return ResponseRepositoryNotFound
case repositorymodels.Conflict:
return ResponseRepositoryConflict
case repositorymodels.BadRequest:
return ResponseRepositoryBadRequest
case datastore.StatusNotFound:
return ResponseDataStoreNotFound
case datastore.Conflict:
return ResponseDataStoreConflict
case datastore.BadRequest:
return ResponseDataStoreBadRequest
default:
return ResponseUnknown
}

View File

@@ -11,7 +11,7 @@ import (
"github.com/pikami/cosmium/api"
"github.com/pikami/cosmium/api/config"
"github.com/pikami/cosmium/internal/repositories"
mapdatastore "github.com/pikami/cosmium/internal/datastore/map_datastore"
)
//export CreateServerInstance
@@ -32,20 +32,20 @@ func CreateServerInstance(serverName *C.char, configurationJSON *C.char) int {
configuration.ApplyDefaultsToEmptyFields()
configuration.PopulateCalculatedFields()
repository := repositories.NewDataRepository(repositories.RepositoryOptions{
dataStore := mapdatastore.NewMapDataStore(mapdatastore.MapDataStoreOptions{
InitialDataFilePath: configuration.InitialDataFilePath,
PersistDataFilePath: configuration.PersistDataFilePath,
})
server := api.NewApiServer(repository, &configuration)
server := api.NewApiServer(dataStore, &configuration)
err = server.Start()
if err != nil {
return ResponseFailedToStartServer
}
addInstance(serverNameStr, &ServerInstance{
server: server,
repository: repository,
server: server,
dataStore: dataStore,
})
return ResponseSuccess
@@ -69,7 +69,7 @@ func GetServerInstanceState(serverName *C.char) *C.char {
serverNameStr := C.GoString(serverName)
if serverInstance, ok := getInstance(serverNameStr); ok {
stateJSON, err := serverInstance.repository.GetState()
stateJSON, err := serverInstance.dataStore.DumpToJson()
if err != nil {
return nil
}
@@ -85,11 +85,14 @@ func LoadServerInstanceState(serverName *C.char, stateJSON *C.char) int {
stateJSONStr := C.GoString(stateJSON)
if serverInstance, ok := getInstance(serverNameStr); ok {
err := serverInstance.repository.LoadStateJSON(stateJSONStr)
if err != nil {
return ResponseFailedToLoadState
if mapDS, ok := serverInstance.dataStore.(*mapdatastore.MapDataStore); ok {
err := mapDS.LoadStateJSON(stateJSONStr)
if err != nil {
return ResponseFailedToLoadState
}
return ResponseSuccess
}
return ResponseSuccess
return ResponseCurentDataStoreDoesNotSupportStateLoading
}
return ResponseServerInstanceNotFound