if X-Timezone-Name header is provided, always calculate the UTC offset based on the specified time

This commit is contained in:
MaysWind
2025-12-26 00:19:16 +08:00
parent 088e9a339d
commit 1cc0cd7ae6
6 changed files with 30 additions and 31 deletions
+2 -2
View File
@@ -150,7 +150,7 @@ func (a *AccountsApi) AccountCreateHandler(c *core.WebContext) (any, *errs.Error
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[accounts.AccountCreateHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[accounts.AccountCreateHandler] cannot get client timezone, because %s", err.Error())
@@ -315,7 +315,7 @@ func (a *AccountsApi) AccountModifyHandler(c *core.WebContext) (any, *errs.Error
return nil, errs.ErrAccountIdInvalid return nil, errs.ErrAccountIdInvalid
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[accounts.AccountModifyHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[accounts.AccountModifyHandler] cannot get client timezone, because %s", err.Error())
+1 -1
View File
@@ -302,7 +302,7 @@ func (a *DataManagementsApi) getExportedFileContent(c *core.WebContext, fileType
return nil, "", errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, "", errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[data_managements.getExportedFileContent] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[data_managements.getExportedFileContent] cannot get client timezone, because %s", err.Error())
+1 -1
View File
@@ -47,7 +47,7 @@ func (a *LargeLanguageModelsApi) RecognizeReceiptImageHandler(c *core.WebContext
return nil, errs.ErrLargeLanguageModelProviderNotEnabled return nil, errs.ErrLargeLanguageModelProviderNotEnabled
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[large_language_models.RecognizeReceiptImageHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[large_language_models.RecognizeReceiptImageHandler] cannot get client timezone, because %s", err.Error())
+16 -16
View File
@@ -121,7 +121,7 @@ func (a *TransactionsApi) TransactionListHandler(c *core.WebContext) (any, *errs
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionListHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionListHandler] cannot get client timezone, because %s", err.Error())
@@ -224,7 +224,7 @@ func (a *TransactionsApi) TransactionMonthListHandler(c *core.WebContext) (any,
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionMonthListHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionMonthListHandler] cannot get client timezone, because %s", err.Error())
@@ -300,7 +300,7 @@ func (a *TransactionsApi) TransactionListAllHandler(c *core.WebContext) (any, *e
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionListAllHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionListAllHandler] cannot get client timezone, because %s", err.Error())
@@ -382,7 +382,7 @@ func (a *TransactionsApi) TransactionReconciliationStatementHandler(c *core.WebC
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionReconciliationStatementHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionReconciliationStatementHandler] cannot get client timezone, because %s", err.Error())
@@ -490,7 +490,7 @@ func (a *TransactionsApi) TransactionStatisticsHandler(c *core.WebContext) (any,
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, utfOffset, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionStatisticsHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionStatisticsHandler] cannot get client timezone, because %s", err.Error())
@@ -510,7 +510,7 @@ func (a *TransactionsApi) TransactionStatisticsHandler(c *core.WebContext) (any,
} }
uid := c.GetCurrentUid() uid := c.GetCurrentUid()
totalAmounts, err := a.transactions.GetAccountsAndCategoriesTotalInflowAndOutflow(c, uid, statisticReq.StartTime, statisticReq.EndTime, tagFilters, noTags, statisticReq.Keyword, utfOffset, clientTimezone, statisticReq.UseTransactionTimezone) totalAmounts, err := a.transactions.GetAccountsAndCategoriesTotalInflowAndOutflow(c, uid, statisticReq.StartTime, statisticReq.EndTime, tagFilters, noTags, statisticReq.Keyword, clientTimezone, statisticReq.UseTransactionTimezone)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.TransactionStatisticsHandler] failed to get accounts and categories total income and expense for user \"uid:%d\", because %s", uid, err.Error()) log.Errorf(c, "[transactions.TransactionStatisticsHandler] failed to get accounts and categories total income and expense for user \"uid:%d\", because %s", uid, err.Error())
@@ -551,7 +551,7 @@ func (a *TransactionsApi) TransactionStatisticsTrendsHandler(c *core.WebContext)
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionStatisticsTrendsHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionStatisticsTrendsHandler] cannot get client timezone, because %s", err.Error())
@@ -626,7 +626,7 @@ func (a *TransactionsApi) TransactionStatisticsAssetTrendsHandler(c *core.WebCon
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionStatisticsAssetTrendsHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionStatisticsAssetTrendsHandler] cannot get client timezone, because %s", err.Error())
@@ -727,7 +727,7 @@ func (a *TransactionsApi) TransactionAmountsHandler(c *core.WebContext) (any, *e
} }
} }
clientTimezone, utfOffset, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionAmountsHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionAmountsHandler] cannot get client timezone, because %s", err.Error())
@@ -749,7 +749,7 @@ func (a *TransactionsApi) TransactionAmountsHandler(c *core.WebContext) (any, *e
for i := 0; i < len(requestItems); i++ { for i := 0; i < len(requestItems); i++ {
requestItem := requestItems[i] requestItem := requestItems[i]
incomeAmounts, expenseAmounts, err := a.transactions.GetAccountsTotalIncomeAndExpense(c, uid, requestItem.StartTime, requestItem.EndTime, excludeAccountIds, excludeCategoryIds, utfOffset, clientTimezone, transactionAmountsReq.UseTransactionTimezone) incomeAmounts, expenseAmounts, err := a.transactions.GetAccountsTotalIncomeAndExpense(c, uid, requestItem.StartTime, requestItem.EndTime, excludeAccountIds, excludeCategoryIds, clientTimezone, transactionAmountsReq.UseTransactionTimezone)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.TransactionAmountsHandler] failed to get transaction amounts item for user \"uid:%d\", because %s", uid, err.Error()) log.Errorf(c, "[transactions.TransactionAmountsHandler] failed to get transaction amounts item for user \"uid:%d\", because %s", uid, err.Error())
@@ -830,7 +830,7 @@ func (a *TransactionsApi) TransactionGetHandler(c *core.WebContext) (any, *errs.
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionGetHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionGetHandler] cannot get client timezone, because %s", err.Error())
@@ -960,7 +960,7 @@ func (a *TransactionsApi) TransactionCreateHandler(c *core.WebContext) (any, *er
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionCreateHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionCreateHandler] cannot get client timezone, because %s", err.Error())
@@ -1097,7 +1097,7 @@ func (a *TransactionsApi) TransactionModifyHandler(c *core.WebContext) (any, *er
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionModifyHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionModifyHandler] cannot get client timezone, because %s", err.Error())
@@ -1354,7 +1354,7 @@ func (a *TransactionsApi) TransactionDeleteHandler(c *core.WebContext) (any, *er
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionDeleteHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionDeleteHandler] cannot get client timezone, because %s", err.Error())
@@ -1488,7 +1488,7 @@ func (a *TransactionsApi) TransactionParseImportFileHandler(c *core.WebContext)
return nil, errs.ErrParameterInvalid return nil, errs.ErrParameterInvalid
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionParseImportFileHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionParseImportFileHandler] cannot get client timezone, because %s", err.Error())
@@ -1719,7 +1719,7 @@ func (a *TransactionsApi) TransactionImportHandler(c *core.WebContext) (any, *er
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err) return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
} }
clientTimezone, _, err := c.GetClientTimezone() clientTimezone, err := c.GetClientTimezone()
if err != nil { if err != nil {
log.Warnf(c, "[transactions.TransactionImportHandler] cannot get client timezone, because %s", err.Error()) log.Warnf(c, "[transactions.TransactionImportHandler] cannot get client timezone, because %s", err.Error())
+4 -5
View File
@@ -187,25 +187,24 @@ func (c *WebContext) GetClientLocale() string {
return value return value
} }
func (c *WebContext) GetClientTimezone() (*time.Location, int16, error) { func (c *WebContext) GetClientTimezone() (*time.Location, error) {
timezoneName := c.getClientTimezoneName() timezoneName := c.getClientTimezoneName()
if timezoneName != "" { if timezoneName != "" {
location, err := time.LoadLocation(timezoneName) location, err := time.LoadLocation(timezoneName)
if err == nil && location != nil { if err == nil && location != nil {
_, tzOffset := time.Now().In(location).Zone() return location, nil
return location, int16(tzOffset / 60), nil
} }
} }
utcOffset, err := c.getClientTimezoneOffset() utcOffset, err := c.getClientTimezoneOffset()
if err != nil { if err != nil {
return nil, 0, err return nil, err
} }
return time.FixedZone("Client Fixed Timezone", int(utcOffset)*60), utcOffset, nil return time.FixedZone("Client Fixed Timezone", int(utcOffset)*60), nil
} }
// SetResponseError sets the response error // SetResponseError sets the response error
+6 -6
View File
@@ -1797,7 +1797,7 @@ func (s *TransactionService) GetRelatedTransferTransaction(originalTransaction *
} }
// GetAccountsTotalIncomeAndExpense returns the every accounts total income and expense amount by specific date range // GetAccountsTotalIncomeAndExpense returns the every accounts total income and expense amount by specific date range
func (s *TransactionService) GetAccountsTotalIncomeAndExpense(c core.Context, uid int64, startUnixTime int64, endUnixTime int64, excludeAccountIds []int64, excludeCategoryIds []int64, utcOffset int16, clientTimezone *time.Location, useTransactionTimezone bool) (map[int64]int64, map[int64]int64, error) { func (s *TransactionService) GetAccountsTotalIncomeAndExpense(c core.Context, uid int64, startUnixTime int64, endUnixTime int64, excludeAccountIds []int64, excludeCategoryIds []int64, clientTimezone *time.Location, useTransactionTimezone bool) (map[int64]int64, map[int64]int64, error) {
if uid <= 0 { if uid <= 0 {
return nil, nil, errs.ErrUserIdInvalid return nil, nil, errs.ErrUserIdInvalid
} }
@@ -1805,8 +1805,8 @@ func (s *TransactionService) GetAccountsTotalIncomeAndExpense(c core.Context, ui
startLocalDateTime := utils.FormatUnixTimeToNumericLocalDateTime(startUnixTime, clientTimezone) startLocalDateTime := utils.FormatUnixTimeToNumericLocalDateTime(startUnixTime, clientTimezone)
endLocalDateTime := utils.FormatUnixTimeToNumericLocalDateTime(endUnixTime, clientTimezone) endLocalDateTime := utils.FormatUnixTimeToNumericLocalDateTime(endUnixTime, clientTimezone)
startUnixTime = utils.GetMinUnixTimeWithSameLocalDateTime(startUnixTime, utcOffset) startUnixTime = utils.GetMinUnixTimeWithSameLocalDateTime(startUnixTime, utils.GetTimezoneOffsetMinutes(startUnixTime, clientTimezone))
endUnixTime = utils.GetMaxUnixTimeWithSameLocalDateTime(endUnixTime, utcOffset) endUnixTime = utils.GetMaxUnixTimeWithSameLocalDateTime(endUnixTime, utils.GetTimezoneOffsetMinutes(endUnixTime, clientTimezone))
startTransactionTime := utils.GetMinTransactionTimeFromUnixTime(startUnixTime) startTransactionTime := utils.GetMinTransactionTimeFromUnixTime(startUnixTime)
endTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(endUnixTime) endTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(endUnixTime)
@@ -1921,7 +1921,7 @@ func (s *TransactionService) GetAccountsTotalIncomeAndExpense(c core.Context, ui
} }
// GetAccountsAndCategoriesTotalInflowAndOutflow returns the every accounts and categories total inflows and outflows amount by specific date range // GetAccountsAndCategoriesTotalInflowAndOutflow returns the every accounts and categories total inflows and outflows amount by specific date range
func (s *TransactionService) GetAccountsAndCategoriesTotalInflowAndOutflow(c core.Context, uid int64, startUnixTime int64, endUnixTime int64, tagFilters []*models.TransactionTagFilter, noTags bool, keyword string, utcOffset int16, clientTimezone *time.Location, useTransactionTimezone bool) ([]*models.Transaction, error) { func (s *TransactionService) GetAccountsAndCategoriesTotalInflowAndOutflow(c core.Context, uid int64, startUnixTime int64, endUnixTime int64, tagFilters []*models.TransactionTagFilter, noTags bool, keyword string, clientTimezone *time.Location, useTransactionTimezone bool) ([]*models.Transaction, error) {
if uid <= 0 { if uid <= 0 {
return nil, errs.ErrUserIdInvalid return nil, errs.ErrUserIdInvalid
} }
@@ -1930,13 +1930,13 @@ func (s *TransactionService) GetAccountsAndCategoriesTotalInflowAndOutflow(c cor
if startUnixTime > 0 { if startUnixTime > 0 {
startLocalDateTime = utils.FormatUnixTimeToNumericLocalDateTime(startUnixTime, clientTimezone) startLocalDateTime = utils.FormatUnixTimeToNumericLocalDateTime(startUnixTime, clientTimezone)
startUnixTime = utils.GetMinUnixTimeWithSameLocalDateTime(startUnixTime, utcOffset) startUnixTime = utils.GetMinUnixTimeWithSameLocalDateTime(startUnixTime, utils.GetTimezoneOffsetMinutes(startUnixTime, clientTimezone))
startTransactionTime = utils.GetMinTransactionTimeFromUnixTime(startUnixTime) startTransactionTime = utils.GetMinTransactionTimeFromUnixTime(startUnixTime)
} }
if endUnixTime > 0 { if endUnixTime > 0 {
endLocalDateTime = utils.FormatUnixTimeToNumericLocalDateTime(endUnixTime, clientTimezone) endLocalDateTime = utils.FormatUnixTimeToNumericLocalDateTime(endUnixTime, clientTimezone)
endUnixTime = utils.GetMaxUnixTimeWithSameLocalDateTime(endUnixTime, utcOffset) endUnixTime = utils.GetMaxUnixTimeWithSameLocalDateTime(endUnixTime, utils.GetTimezoneOffsetMinutes(endUnixTime, clientTimezone))
endTransactionTime = utils.GetMaxTransactionTimeFromUnixTime(endUnixTime) endTransactionTime = utils.GetMaxTransactionTimeFromUnixTime(endUnixTime)
} }