Init Eslogad
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
const DateFormatDDMMYYYY = "02-01-2006"
|
||||
|
||||
// ParseDateToJakartaTime parses a date string in DD-MM-YYYY format and converts it to Jakarta timezone
|
||||
// Returns start of day (00:00:00) in Jakarta timezone
|
||||
func ParseDateToJakartaTime(dateStr string) (*time.Time, error) {
|
||||
if dateStr == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
date, err := time.Parse(DateFormatDDMMYYYY, dateStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
jakartaLoc, err := time.LoadLocation("Asia/Jakarta")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
jakartaTime := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, jakartaLoc)
|
||||
return &jakartaTime, nil
|
||||
}
|
||||
|
||||
// ParseDateToJakartaTimeEndOfDay parses a date string in DD-MM-YYYY format and converts it to Jakarta timezone
|
||||
// Returns end of day (23:59:59.999999999) in Jakarta timezone
|
||||
func ParseDateToJakartaTimeEndOfDay(dateStr string) (*time.Time, error) {
|
||||
if dateStr == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
date, err := time.Parse(DateFormatDDMMYYYY, dateStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
jakartaLoc, err := time.LoadLocation("Asia/Jakarta")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
jakartaTime := time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 999999999, jakartaLoc)
|
||||
return &jakartaTime, nil
|
||||
}
|
||||
|
||||
// ParseDateRangeToJakartaTime parses date_from and date_to strings and returns them in Jakarta timezone
|
||||
// date_from will be start of day (00:00:00), date_to will be end of day (23:59:59.999999999)
|
||||
func ParseDateRangeToJakartaTime(dateFrom, dateTo string) (*time.Time, *time.Time, error) {
|
||||
var fromTime, toTime *time.Time
|
||||
var err error
|
||||
|
||||
if dateFrom != "" {
|
||||
fromTime, err = ParseDateToJakartaTime(dateFrom)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if dateTo != "" {
|
||||
toTime, err = ParseDateToJakartaTimeEndOfDay(dateTo)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return fromTime, toTime, nil
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestParseDateToJakartaTime(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
dateStr string
|
||||
expected *time.Time
|
||||
hasError bool
|
||||
}{
|
||||
{
|
||||
name: "valid date",
|
||||
dateStr: "06-08-2025",
|
||||
expected: nil, // Will be set during test
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "empty string",
|
||||
dateStr: "",
|
||||
expected: nil,
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "invalid date format",
|
||||
dateStr: "2025-08-06",
|
||||
hasError: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := ParseDateToJakartaTime(tt.dateStr)
|
||||
|
||||
if tt.hasError {
|
||||
if err == nil {
|
||||
t.Errorf("Expected error but got none")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if tt.expected == nil && tt.dateStr == "" {
|
||||
if result != nil {
|
||||
t.Errorf("Expected nil but got %v", result)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if result == nil && tt.dateStr != "" {
|
||||
t.Errorf("Expected time but got nil")
|
||||
return
|
||||
}
|
||||
|
||||
// Check if it's in Jakarta timezone
|
||||
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
|
||||
if result.Location().String() != jakartaLoc.String() {
|
||||
t.Errorf("Expected Jakarta timezone but got %v", result.Location())
|
||||
}
|
||||
|
||||
// Check if it's start of day
|
||||
if result.Hour() != 0 || result.Minute() != 0 || result.Second() != 0 {
|
||||
t.Errorf("Expected start of day but got %v", result.Format("15:04:05"))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseDateToJakartaTimeEndOfDay(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
dateStr string
|
||||
expected *time.Time
|
||||
hasError bool
|
||||
}{
|
||||
{
|
||||
name: "valid date",
|
||||
dateStr: "06-08-2025",
|
||||
expected: nil, // Will be set during test
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "empty string",
|
||||
dateStr: "",
|
||||
expected: nil,
|
||||
hasError: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := ParseDateToJakartaTimeEndOfDay(tt.dateStr)
|
||||
|
||||
if tt.hasError {
|
||||
if err == nil {
|
||||
t.Errorf("Expected error but got none")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if tt.expected == nil && tt.dateStr == "" {
|
||||
if result != nil {
|
||||
t.Errorf("Expected nil but got %v", result)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if result == nil && tt.dateStr != "" {
|
||||
t.Errorf("Expected time but got nil")
|
||||
return
|
||||
}
|
||||
|
||||
// Check if it's in Jakarta timezone
|
||||
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
|
||||
if result.Location().String() != jakartaLoc.String() {
|
||||
t.Errorf("Expected Jakarta timezone but got %v", result.Location())
|
||||
}
|
||||
|
||||
// Check if it's end of day
|
||||
if result.Hour() != 23 || result.Minute() != 59 || result.Second() != 59 {
|
||||
t.Errorf("Expected end of day but got %v", result.Format("15:04:05"))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseDateRangeToJakartaTime(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
dateFrom string
|
||||
dateTo string
|
||||
hasError bool
|
||||
}{
|
||||
{
|
||||
name: "valid date range",
|
||||
dateFrom: "06-08-2025",
|
||||
dateTo: "06-08-2025",
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "empty strings",
|
||||
dateFrom: "",
|
||||
dateTo: "",
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "only date_from",
|
||||
dateFrom: "06-08-2025",
|
||||
dateTo: "",
|
||||
hasError: false,
|
||||
},
|
||||
{
|
||||
name: "only date_to",
|
||||
dateFrom: "",
|
||||
dateTo: "06-08-2025",
|
||||
hasError: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
fromTime, toTime, err := ParseDateRangeToJakartaTime(tt.dateFrom, tt.dateTo)
|
||||
|
||||
if tt.hasError {
|
||||
if err == nil {
|
||||
t.Errorf("Expected error but got none")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// If dateFrom is provided, check it's start of day
|
||||
if tt.dateFrom != "" && fromTime != nil {
|
||||
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
|
||||
if fromTime.Location().String() != jakartaLoc.String() {
|
||||
t.Errorf("Expected Jakarta timezone for date_from but got %v", fromTime.Location())
|
||||
}
|
||||
if fromTime.Hour() != 0 || fromTime.Minute() != 0 || fromTime.Second() != 0 {
|
||||
t.Errorf("Expected start of day for date_from but got %v", fromTime.Format("15:04:05"))
|
||||
}
|
||||
}
|
||||
|
||||
// If dateTo is provided, check it's end of day
|
||||
if tt.dateTo != "" && toTime != nil {
|
||||
jakartaLoc, _ := time.LoadLocation("Asia/Jakarta")
|
||||
if toTime.Location().String() != jakartaLoc.String() {
|
||||
t.Errorf("Expected Jakarta timezone for date_to but got %v", toTime.Location())
|
||||
}
|
||||
if toTime.Hour() != 23 || toTime.Minute() != 59 || toTime.Second() != 59 {
|
||||
t.Errorf("Expected end of day for date_to but got %v", toTime.Format("15:04:05"))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"eslogad-be/internal/constants"
|
||||
"eslogad-be/internal/contract"
|
||||
"eslogad-be/internal/logger"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func HandleResponse(w http.ResponseWriter, r *http.Request, response *contract.Response, methodName string) {
|
||||
var statusCode int
|
||||
if response.GetSuccess() {
|
||||
statusCode = http.StatusOK
|
||||
} else {
|
||||
responseError := response.GetErrors()[0]
|
||||
statusCode = MapErrorCodeToHttpStatus(responseError.GetCode())
|
||||
}
|
||||
WriteResponse(w, r, *response, statusCode, methodName)
|
||||
}
|
||||
|
||||
func WriteResponse(w http.ResponseWriter, r *http.Request, resp contract.Response, statusCode int, methodName string) {
|
||||
w.WriteHeader(statusCode)
|
||||
response, err := json.Marshal(resp)
|
||||
if err != nil {
|
||||
logger.FromContext(r.Context()).Error(methodName, "unable to marshal json response", err)
|
||||
}
|
||||
_, err = w.Write(response)
|
||||
if err != nil {
|
||||
logger.FromContext(r.Context()).Error(methodName, "unable to write to response", err)
|
||||
}
|
||||
}
|
||||
|
||||
func MapErrorCodeToHttpStatus(code string) int {
|
||||
statusCode := constants.HttpErrorMap[code]
|
||||
if statusCode == 0 {
|
||||
return http.StatusInternalServerError
|
||||
}
|
||||
return statusCode
|
||||
}
|
||||
|
||||
func ExtractEndpointFromURL(requestURL string) string {
|
||||
parsedURL, err := url.Parse(requestURL)
|
||||
if err != nil {
|
||||
return "/"
|
||||
}
|
||||
return parsedURL.Path
|
||||
}
|
||||
Reference in New Issue
Block a user