423 lines
9.4 KiB
Go
423 lines
9.4 KiB
Go
/*
|
|
|--------------------------------------------------------------------------
|
|
| Retriever
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Name:
|
|
| - Retriever
|
|
|
|
|
| Purpose:
|
|
| - Retrieve data from supported resource providers through a unified
|
|
| retrieval interface.
|
|
|
|
|
| Guidelines:
|
|
| - Validate retrieval type before processing.
|
|
| - Validate configuration according to retrieval type.
|
|
| - Route retrieval through type-based dispatching.
|
|
| - Maintain provider registries per retrieval type.
|
|
| - Hide provider-specific implementation details from consumers.
|
|
|
|
|
| Examples:
|
|
| - ObrimRetriever("json", config)
|
|
| - ObrimRetrieverJsonRegister("metadata", provider)
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Credit
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Contributor:
|
|
| - Rajon Ahmed
|
|
| - Scionite
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
package retriever
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
|
|
"go/module/essential/visible/service/helper/log"
|
|
"go/module/essential/visible/service/helper/status"
|
|
)
|
|
|
|
// JSON Provider Purpose: Retrieve a complete resource payload.
|
|
type ObrimRetrieverJsonProvider interface {
|
|
Retrieve() (any, error)
|
|
}
|
|
|
|
// JSON Registry Purpose: Store registered JSON providers.
|
|
var ObrimRetrieverJsonRegistry = struct {
|
|
sync.RWMutex
|
|
Providers map[string]ObrimRetrieverJsonProvider
|
|
}{
|
|
Providers: map[string]ObrimRetrieverJsonProvider{},
|
|
}
|
|
|
|
// DB Registry Purpose: Store registered database providers.
|
|
var ObrimRetrieverDbRegistry = struct {
|
|
sync.RWMutex
|
|
Providers map[string]any
|
|
}{
|
|
Providers: map[string]any{},
|
|
}
|
|
|
|
// Function Name: ObrimRetriever
|
|
// Function Purpose: Retrieve data using a unified retrieval interface.
|
|
func ObrimRetriever(retrievalType string, config map[string]any) map[string]any {
|
|
status.ObrimStatus("INFO", "Processing retrieval request.")
|
|
log.ObrimLog("INIT", "Retriever execution started.")
|
|
|
|
if response := obrimRetrieverValidateType(retrievalType); response != nil {
|
|
return response
|
|
}
|
|
|
|
if response := obrimRetrieverValidateConfig(retrievalType, config); response != nil {
|
|
return response
|
|
}
|
|
|
|
switch retrievalType {
|
|
case "json":
|
|
return obrimRetrieverJson(config)
|
|
|
|
case "db":
|
|
return obrimRetrieverDb(config)
|
|
|
|
default:
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_UNSUPPORTED_TYPE",
|
|
nil,
|
|
)
|
|
}
|
|
}
|
|
|
|
// Function Name: ObrimRetrieverJsonRegister
|
|
// Function Purpose: Register a JSON provider against a resource identifier.
|
|
func ObrimRetrieverJsonRegister(resource string, provider any) {
|
|
jsonProvider, ok := provider.(ObrimRetrieverJsonProvider)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
ObrimRetrieverJsonRegistry.Lock()
|
|
defer ObrimRetrieverJsonRegistry.Unlock()
|
|
|
|
ObrimRetrieverJsonRegistry.Providers[resource] = jsonProvider
|
|
}
|
|
|
|
// Function Name: ObrimRetrieverDbRegister
|
|
// Function Purpose: Register a database provider against a resource identifier.
|
|
func ObrimRetrieverDbRegister(resource string, provider any) {
|
|
ObrimRetrieverDbRegistry.Lock()
|
|
defer ObrimRetrieverDbRegistry.Unlock()
|
|
|
|
ObrimRetrieverDbRegistry.Providers[resource] = provider
|
|
}
|
|
|
|
// Function Name: obrimRetrieverValidateType
|
|
// Function Purpose: Validate the requested retrieval type.
|
|
func obrimRetrieverValidateType(retrievalType string) map[string]any {
|
|
switch retrievalType {
|
|
case "json", "db":
|
|
return nil
|
|
default:
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_UNSUPPORTED_TYPE",
|
|
nil,
|
|
)
|
|
}
|
|
}
|
|
|
|
// Function Name: obrimRetrieverValidateConfig
|
|
// Function Purpose: Validate configuration according to retrieval type requirements.
|
|
func obrimRetrieverValidateConfig(
|
|
retrievalType string,
|
|
config map[string]any,
|
|
) map[string]any {
|
|
if config == nil {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_MISSING_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
switch retrievalType {
|
|
case "json":
|
|
return obrimRetrieverJsonValidate(config)
|
|
|
|
case "db":
|
|
return obrimRetrieverDbValidate(config)
|
|
|
|
default:
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_UNSUPPORTED_TYPE",
|
|
nil,
|
|
)
|
|
}
|
|
}
|
|
|
|
// Function Name: obrimRetrieverResolveProvider
|
|
// Function Purpose: Resolve a provider using a registered resource identifier.
|
|
func obrimRetrieverResolveProvider(resource string) (any, bool) {
|
|
ObrimRetrieverJsonRegistry.RLock()
|
|
defer ObrimRetrieverJsonRegistry.RUnlock()
|
|
|
|
provider, exists := ObrimRetrieverJsonRegistry.Providers[resource]
|
|
|
|
return provider, exists
|
|
}
|
|
|
|
// Function Name: obrimRetrieverBuildResponse
|
|
// Function Purpose: Build standardized utility responses.
|
|
func obrimRetrieverBuildResponse(
|
|
statusValue bool,
|
|
code string,
|
|
payload any,
|
|
) map[string]any {
|
|
return map[string]any{
|
|
"status": statusValue,
|
|
"code": code,
|
|
"payload": payload,
|
|
}
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJson
|
|
// Function Purpose: Process JSON retrieval requests.
|
|
func obrimRetrieverJson(config map[string]any) map[string]any {
|
|
resource := config["resource"].(string)
|
|
|
|
provider, exists := obrimRetrieverResolveProvider(resource)
|
|
if !exists {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_RESOURCE_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
jsonProvider := provider.(ObrimRetrieverJsonProvider)
|
|
|
|
if _, exists := config["path"]; exists {
|
|
return obrimRetrieverJsonPath(jsonProvider, config)
|
|
}
|
|
|
|
if _, exists := config["fields"]; exists {
|
|
return obrimRetrieverJsonFields(jsonProvider, config)
|
|
}
|
|
|
|
return obrimRetrieverJsonResource(jsonProvider)
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJsonResource
|
|
// Function Purpose: Retrieve a complete JSON resource payload.
|
|
func obrimRetrieverJsonResource(
|
|
provider ObrimRetrieverJsonProvider,
|
|
) map[string]any {
|
|
data, err := provider.Retrieve()
|
|
if err != nil {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_RESOURCE_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
return obrimRetrieverBuildResponse(
|
|
true,
|
|
"SUCCESS_RESOURCE",
|
|
map[string]any{
|
|
"data": data,
|
|
},
|
|
)
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJsonPath
|
|
// Function Purpose: Retrieve a value using a dot-notation path.
|
|
func obrimRetrieverJsonPath(
|
|
provider ObrimRetrieverJsonProvider,
|
|
config map[string]any,
|
|
) map[string]any {
|
|
data, err := provider.Retrieve()
|
|
if err != nil {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_RESOURCE_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
path := config["path"].(string)
|
|
|
|
value, found := obrimRetrieverJsonResolvePath(data, path)
|
|
if !found {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_PATH_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
return obrimRetrieverBuildResponse(
|
|
true,
|
|
"SUCCESS_PATH",
|
|
map[string]any{
|
|
"data": value,
|
|
},
|
|
)
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJsonFields
|
|
// Function Purpose: Retrieve multiple values using field path selection.
|
|
func obrimRetrieverJsonFields(
|
|
provider ObrimRetrieverJsonProvider,
|
|
config map[string]any,
|
|
) map[string]any {
|
|
data, err := provider.Retrieve()
|
|
if err != nil {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_RESOURCE_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
fields, ok := config["fields"].([]string)
|
|
if !ok {
|
|
interfaceFields, ok := config["fields"].([]any)
|
|
if !ok {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_INVALID_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
fields = make([]string, 0, len(interfaceFields))
|
|
|
|
for _, field := range interfaceFields {
|
|
fieldString, ok := field.(string)
|
|
if !ok {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_INVALID_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
fields = append(fields, fieldString)
|
|
}
|
|
}
|
|
|
|
result := map[string]any{}
|
|
|
|
for _, field := range fields {
|
|
value, found := obrimRetrieverJsonResolvePath(data, field)
|
|
if !found {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_FIELD_NOT_FOUND",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
result[field] = value
|
|
}
|
|
|
|
return obrimRetrieverBuildResponse(
|
|
true,
|
|
"SUCCESS_FIELDS",
|
|
map[string]any{
|
|
"data": result,
|
|
},
|
|
)
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJsonValidate
|
|
// Function Purpose: Validate JSON retrieval configuration.
|
|
func obrimRetrieverJsonValidate(config map[string]any) map[string]any {
|
|
resource, exists := config["resource"]
|
|
if !exists {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_MISSING_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
resourceString, ok := resource.(string)
|
|
if !ok || strings.TrimSpace(resourceString) == "" {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_INVALID_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
_, hasPath := config["path"]
|
|
_, hasFields := config["fields"]
|
|
|
|
if hasPath && hasFields {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_INVALID_CONFIGURATION",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Function Name: obrimRetrieverDb
|
|
// Function Purpose: Process database retrieval requests.
|
|
func obrimRetrieverDb(config map[string]any) map[string]any {
|
|
return obrimRetrieverBuildResponse(
|
|
false,
|
|
"FAILED_NOT_IMPLEMENTED",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
// Function Name: obrimRetrieverDbValidate
|
|
// Function Purpose: Validate database retrieval configuration.
|
|
func obrimRetrieverDbValidate(config map[string]any) map[string]any {
|
|
return nil
|
|
}
|
|
|
|
// Function Name: obrimRetrieverJsonResolvePath
|
|
// Function Purpose: Resolve a dot-notation path from a resource payload.
|
|
func obrimRetrieverJsonResolvePath(
|
|
data any,
|
|
path string,
|
|
) (any, bool) {
|
|
if strings.TrimSpace(path) == "" {
|
|
return data, true
|
|
}
|
|
|
|
current := data
|
|
|
|
for _, segment := range strings.Split(path, ".") {
|
|
object, ok := current.(map[string]any)
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
|
|
value, exists := object[segment]
|
|
if !exists {
|
|
return nil, false
|
|
}
|
|
|
|
current = value
|
|
}
|
|
|
|
return current, true
|
|
}
|