mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-15 01:54:43 +00:00
* Remove restating comments in backend * Remove restating comments in frontend stories * Remove restating comments in pipeline * Remove restating comments in pipeline scripts * Restore location-clear comment in BreweryRepository * Remove stale/restating comments found in second pass * Restore mock curated-data branch comment in main.cc * Remove more restating/filler comments in backend * Document account-management endpoints, compose files, and env generator * Squashed commit of the following: commit a8a5b8abd9969859c695092fae6990d03b2135ed Author: Aaron Po <aaron.po97@gmail.com> Date: Sun Aug 23 23:53:56 2026 -0400 Add reverse geocoding for brewery street addresses (#245) * Add geocoding to seed application, remove postal codes from generator Update comments * Update pipeline class diagram for OpenAI generator * Update pipeline activity diagram for brewery coordinates and OpenAI backend * Add mailpit, production, db-only, and minimal environments to deployment diagram * Fix authentication flow diagram for Identity migration * Add account-management flows to authentication diagram * Fix database schema diagram note referencing removed AuthRepository
66 lines
2.0 KiB
C++
66 lines
2.0 KiB
C++
#ifndef BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATETIME_DATE_TIME_PROVIDER_H_
|
|
#define BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATETIME_DATE_TIME_PROVIDER_H_
|
|
|
|
/**
|
|
* @file services/date_time_provider.h
|
|
* @brief Abstraction for UTC timestamp generation.
|
|
*/
|
|
|
|
#include <chrono>
|
|
#include <ctime>
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
|
|
/**
|
|
* @brief Interface for UTC timestamp providers.
|
|
*/
|
|
class IDateTimeProvider {
|
|
public:
|
|
virtual ~IDateTimeProvider() = default;
|
|
|
|
IDateTimeProvider() = default;
|
|
IDateTimeProvider(const IDateTimeProvider&) = delete;
|
|
IDateTimeProvider& operator=(const IDateTimeProvider&) = delete;
|
|
IDateTimeProvider(IDateTimeProvider&&) = delete;
|
|
IDateTimeProvider& operator=(IDateTimeProvider&&) = delete;
|
|
|
|
/**
|
|
* @brief Returns the current UTC timestamp in a file-safe format.
|
|
*
|
|
* @return UTC timestamp string.
|
|
*/
|
|
virtual std::string GetUtcTimestamp() = 0;
|
|
};
|
|
|
|
/**
|
|
* @brief Timestamp provider backed by the system clock.
|
|
*/
|
|
class SystemDateTimeProvider final : public IDateTimeProvider {
|
|
public:
|
|
std::string GetUtcTimestamp() override {
|
|
constexpr int kFractionalSecondWidth = 6;
|
|
|
|
const auto now = std::chrono::system_clock::now();
|
|
const auto now_time = std::chrono::system_clock::to_time_t(now);
|
|
const std::tm* utc_time_ptr = std::gmtime(&now_time);
|
|
if (utc_time_ptr == nullptr) {
|
|
throw std::runtime_error("Failed to format UTC timestamp");
|
|
}
|
|
|
|
const auto fractional_seconds =
|
|
std::chrono::duration_cast<std::chrono::microseconds>(
|
|
now.time_since_epoch()) %
|
|
std::chrono::seconds(1);
|
|
|
|
std::ostringstream output;
|
|
output << std::put_time(utc_time_ptr, "%Y-%m-%dT%H-%M-%S");
|
|
output << '.' << std::setw(kFractionalSecondWidth) << std::setfill('0')
|
|
<< fractional_seconds.count() << 'Z';
|
|
return output.str();
|
|
}
|
|
};
|
|
|
|
#endif // BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATETIME_DATE_TIME_PROVIDER_H_
|