obrimbaseapi/data/software/glossary/handler.go

137 lines
3.7 KiB
Go

/*
|--------------------------------------------------------------------------
| Metadata
|--------------------------------------------------------------------------
|
| Name:
| - Handler
|
| Purpose:
| - Provide a JSON resource provider for the Retriever utility.
| - Embed, parse, and expose a complete JSON resource payload.
| - Abstract resource storage details from consumers.
|
| Guideline:
| - Register the handler through retriever.ObrimRetrieverJsonRegister().
| - Associate the handler with a unique resource identifier.
| - Return the complete parsed resource payload only.
| - Delegate retrieval, traversal, filtering, and selection logic to Retriever.
| - Do not implement business logic within the handler.
| - Do not perform querying, transformation, or resource discovery.
|
| Example:
| - retriever.ObrimRetrieverJsonRegister(
| "software/metadata",
| obrimHandlerProvider{},
| )
| - response := retriever.ObrimRetriever(
| "json",
| map[string]any{
| "resource": "software/metadata",
| },
| )
|
|--------------------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| Credit
|--------------------------------------------------------------------------
|
| Contributor:
| - Rajon Ahmed
| - Blockonite
|
|--------------------------------------------------------------------------
*/
package handler
import (
"embed"
"encoding/json"
"errors"
"go/module/essential/visible/service/helper/retriever"
)
// constant
const (
// resource
obrimHandlerResourceIdentifier = "software/glossary" // change identifier if needed
obrimHandlerResourceFileName = "resource" // change file name if needed
obrimHandlerResourceFileExt = ".json" // do not change
// success
ObrimHandlerCodeSuccessResourceAvailable = "SUCCESS_RESOURCE_AVAILABLE"
// fail
ObrimHandlerCodeFailedResourceNotFound = "FAILED_RESOURCE_NOT_FOUND"
ObrimHandlerCodeFailedInvalidResource = "FAILED_INVALID_RESOURCE"
)
// obrimHandlerEmbeddedResource stores the embedded resource file.
//
//go:embed resource.json
var obrimHandlerEmbeddedResource embed.FS
// obrimHandlerProvider implements the Retriever JSON provider contract.
type obrimHandlerProvider struct{}
// Retrieve loads and returns the complete parsed resource payload.
func (provider obrimHandlerProvider) Retrieve() (any, error) {
return obrimHandlerFetch()
}
// init registers the handler during package initialization.
func init() {
obrimHandlerRegister()
}
// obrimHandlerRegister registers the handler with Retriever.
func obrimHandlerRegister() {
retriever.ObrimRetrieverJsonRegister(
obrimHandlerResourceIdentifier,
obrimHandlerProvider{},
)
}
// obrimHandlerFetch loads, parses, and returns the complete resource payload.
func obrimHandlerFetch() (any, error) {
resource, err := obrimHandlerLoadResource()
if err != nil {
return nil, err
}
payload, err := obrimHandlerParseResource(resource)
if err != nil {
return nil, err
}
return payload, nil
}
// obrimHandlerLoadResource loads the embedded resource.
func obrimHandlerLoadResource() ([]byte, error) {
resource, err := obrimHandlerEmbeddedResource.ReadFile(
obrimHandlerResourceFileName + obrimHandlerResourceFileExt,
)
if err != nil {
return nil, errors.New(ObrimHandlerCodeFailedResourceNotFound)
}
return resource, nil
}
// obrimHandlerParseResource parses the embedded JSON resource.
func obrimHandlerParseResource(resource []byte) (map[string]any, error) {
var payload map[string]any
if err := json.Unmarshal(resource, &payload); err != nil {
return nil, errors.New(ObrimHandlerCodeFailedInvalidResource)
}
return payload, nil
}