233 lines
6.5 KiB
Go
233 lines
6.5 KiB
Go
/*
|
|
|--------------------------------------------------------------------------
|
|
| Datetime
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Name:
|
|
| - datetime
|
|
|
|
|
| Purpose:
|
|
| - Retrieve and format the current date and time from either the
|
|
| host system clock or a trusted NTP source using framework-
|
|
| supported format patterns.
|
|
|
|
|
| Guidelines:
|
|
| - Validate all inputs before execution.
|
|
| - Use framework-defined format mappings only.
|
|
| - Return standardized response structures.
|
|
| - Emit status and log messages for initialization, success,
|
|
| and failure events.
|
|
|
|
|
| Examples:
|
|
| - ObrimDatetime("local", map[string]any{"format":"yyyy-MM-dd"})
|
|
| - ObrimDatetime("trusted", map[string]any{"format":"timestampsec"})
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Credit
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Contributor:
|
|
| - Rajon Ahmed
|
|
| - Scionite
|
|
|
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
package datetime
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
"go/module/essential/visible/service/helper/log"
|
|
"go/module/essential/visible/service/helper/retriever"
|
|
"go/module/essential/visible/service/helper/status"
|
|
|
|
"github.com/beevik/ntp"
|
|
)
|
|
|
|
// Mutable Variable Purpose: Framework-supported datetime pattern mappings.
|
|
var obrimDatetimePatternMap = map[string]string{
|
|
"yyyy-MM-dd": "2006-01-02",
|
|
"MMM dd, yyyy": "Jan 02, 2006",
|
|
"MMMM dd, yyyy": "January 02, 2006",
|
|
"EEE, MMM dd, yyyy": "Mon, Jan 02, 2006",
|
|
"EEE, MMMM dd, yyyy": "Mon, January 02, 2006",
|
|
"EEEE, MMM dd, yyyy": "Monday, Jan 02, 2006",
|
|
"EEEE, MMMM dd, yyyy": "Monday, January 02, 2006",
|
|
"HH:mm:ss": "15:04:05",
|
|
"hh:mm:ss a": "03:04:05 PM",
|
|
"yyyy-MM-dd HH:mm:ss": "2006-01-02 15:04:05",
|
|
"yyyy-MM-dd HH:mm:ss z": "2006-01-02 15:04:05 MST",
|
|
"yyyy-MM-dd'T'HH:mm:ssXXX": "2006-01-02T15:04:05Z07:00",
|
|
}
|
|
|
|
// Function Name: ObrimDatetime
|
|
// Function Purpose: Retrieve and format the current date and time from a selected source using a supported format pattern.
|
|
func ObrimDatetime(datetimeType string, config map[string]any) map[string]any {
|
|
status.ObrimStatus("INFO", "Datetime utility initialization started.")
|
|
log.ObrimLog("INIT", "Datetime utility initialization started.")
|
|
|
|
if err := obrimDatetimeValidate(datetimeType, config); err != nil {
|
|
status.ObrimStatus("ERROR", err.Error())
|
|
log.ObrimLog("ERROR", err.Error())
|
|
|
|
switch err.Error() {
|
|
case "INVALID_TYPE":
|
|
return obrimDatetimeResponse(false, "FAILED_INVALID_TYPE", nil)
|
|
case "INVALID_FORMAT":
|
|
return obrimDatetimeResponse(false, "FAILED_INVALID_FORMAT", nil)
|
|
default:
|
|
return obrimDatetimeResponse(false, "FAILED_VALIDATION", nil)
|
|
}
|
|
}
|
|
|
|
var currentTime time.Time
|
|
var err error
|
|
|
|
switch datetimeType {
|
|
case "local":
|
|
currentTime, err = obrimDatetimeLocal()
|
|
case "trusted":
|
|
currentTime, err = obrimDatetimeTrusted()
|
|
default:
|
|
err = errors.New("INVALID_TYPE")
|
|
}
|
|
|
|
if err != nil {
|
|
status.ObrimStatus("ERROR", err.Error())
|
|
log.ObrimLog("ERROR", err.Error())
|
|
|
|
return obrimDatetimeResponse(false, "FAILED_DATETIME_RETRIEVAL", nil)
|
|
}
|
|
|
|
value, err := obrimDatetimeFormatApply(currentTime, fmt.Sprintf("%v", config["format"]))
|
|
if err != nil {
|
|
status.ObrimStatus("ERROR", err.Error())
|
|
log.ObrimLog("ERROR", err.Error())
|
|
|
|
return obrimDatetimeResponse(false, "FAILED_INVALID_FORMAT", nil)
|
|
}
|
|
|
|
status.ObrimStatus("SUCCESS", "Datetime retrieved successfully.")
|
|
log.ObrimLog("SUCCESS", "Datetime retrieved successfully.")
|
|
|
|
return obrimDatetimeResponse(
|
|
true,
|
|
"SUCCESS_DATETIME_RETRIEVED",
|
|
map[string]any{
|
|
"value": value,
|
|
},
|
|
)
|
|
}
|
|
|
|
// Function Name: obrimDatetimeValidate
|
|
// Function Purpose: Validate utility inputs and configuration.
|
|
func obrimDatetimeValidate(datetimeType string, config map[string]any) error {
|
|
if datetimeType != "local" && datetimeType != "trusted" {
|
|
return errors.New("INVALID_TYPE")
|
|
}
|
|
|
|
formatValue, exists := config["format"]
|
|
if !exists {
|
|
return errors.New("INVALID_FORMAT")
|
|
}
|
|
|
|
formatString := fmt.Sprintf("%v", formatValue)
|
|
|
|
if !obrimDatetimePatternValidate(formatString) {
|
|
return errors.New("INVALID_FORMAT")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Function Name: obrimDatetimePatternValidate
|
|
// Function Purpose: Validate supported format patterns.
|
|
func obrimDatetimePatternValidate(pattern string) bool {
|
|
if pattern == "timestampsec" || pattern == "timestampmil" {
|
|
return true
|
|
}
|
|
|
|
_, exists := obrimDatetimePatternMap[pattern]
|
|
return exists
|
|
}
|
|
|
|
// Function Name: obrimDatetimePatternResolve
|
|
// Function Purpose: Resolve supported format patterns into internal formatting layouts.
|
|
func obrimDatetimePatternResolve(pattern string) (string, error) {
|
|
layout, exists := obrimDatetimePatternMap[pattern]
|
|
if !exists {
|
|
return "", errors.New("INVALID_FORMAT")
|
|
}
|
|
|
|
return layout, nil
|
|
}
|
|
|
|
// Function Name: obrimDatetimeFormatApply
|
|
// Function Purpose: Generate the final formatted value.
|
|
func obrimDatetimeFormatApply(currentTime time.Time, pattern string) (string, error) {
|
|
switch pattern {
|
|
case "timestampsec":
|
|
return strconv.FormatInt(currentTime.Unix(), 10), nil
|
|
|
|
case "timestampmil":
|
|
return strconv.FormatInt(currentTime.UnixMilli(), 10), nil
|
|
}
|
|
|
|
layout, err := obrimDatetimePatternResolve(pattern)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return currentTime.Format(layout), nil
|
|
}
|
|
|
|
// Function Name: obrimDatetimeResponse
|
|
// Function Purpose: Build standardized utility response objects.
|
|
func obrimDatetimeResponse(statusValue bool, code string, payload any) map[string]any {
|
|
return map[string]any{
|
|
"status": statusValue,
|
|
"code": code,
|
|
"payload": payload,
|
|
}
|
|
}
|
|
|
|
// Function Name: obrimDatetimeLocal
|
|
// Function Purpose: Retrieve current date and time from the host system clock.
|
|
func obrimDatetimeLocal() (time.Time, error) {
|
|
_, _ = retriever.ObrimRetriever(
|
|
"datetime",
|
|
map[string]any{
|
|
"source": "local",
|
|
},
|
|
)
|
|
|
|
return time.Now(), nil
|
|
}
|
|
|
|
// Function Name: obrimDatetimeTrusted
|
|
// Function Purpose: Retrieve current date and time from the framework-managed NTP pool source.
|
|
func obrimDatetimeTrusted() (time.Time, error) {
|
|
return obrimDatetimeTrustedSync()
|
|
}
|
|
|
|
// Function Name: obrimDatetimeTrustedSync
|
|
// Function Purpose: Synchronize and retrieve trusted time from the NTP source.
|
|
func obrimDatetimeTrustedSync() (time.Time, error) {
|
|
_, _ = retriever.ObrimRetriever(
|
|
"datetime",
|
|
map[string]any{
|
|
"source": "trusted",
|
|
},
|
|
)
|
|
|
|
return ntp.Time("pool.ntp.org")
|
|
}
|