From c7bd7238c6b93af93331fbf77db7f412adb22f96 Mon Sep 17 00:00:00 2001 From: shibao Date: Sat, 5 Apr 2025 01:13:00 +0000 Subject: [PATCH] improve accuracy of timestamps --- CHANGELOG.md | 1 + config/config.exs | 2 +- lib/cannery.ex | 1 + lib/cannery/accounts/invite.ex | 10 ++-- lib/cannery/accounts/invites.ex | 2 +- lib/cannery/accounts/user.ex | 12 ++--- lib/cannery/accounts/user_token.ex | 2 +- lib/cannery/activity_log/shot_record.ex | 6 +-- lib/cannery/ammo.ex | 2 +- lib/cannery/ammo/pack.ex | 6 +-- lib/cannery/ammo/type.ex | 6 +-- lib/cannery/containers/container.ex | 6 +-- lib/cannery/containers/container_tag.ex | 6 +-- lib/cannery/containers/tag.ex | 6 +-- lib/cannery_web/components/core_components.ex | 6 +-- lib/cannery_web/live/invite_live/index.ex | 2 +- ...0210814225804_create_users_auth_tables.exs | 2 +- .../migrations/20210903015442_create_tags.exs | 2 +- .../20210903015537_create_ammo_types.exs | 2 +- .../20210903015553_create_containers.exs | 2 +- .../20210903015611_create_ammo_groups.exs | 2 +- .../20210904211727_create_invites.exs | 2 +- .../20210912224533_create_container_tags.exs | 2 +- .../20220214031736_create_shot_groups.exs | 2 +- .../20250405004036_set_utc_datetime.exs | 52 +++++++++++++++++++ .../controllers/export_controller_test.exs | 4 +- test/cannery_web/live/container_live_test.exs | 4 +- test/cannery_web/live/pack_live_test.exs | 12 ++--- test/cannery_web/live/type_live_test.exs | 22 ++++---- 29 files changed, 120 insertions(+), 66 deletions(-) create mode 100644 priv/repo/migrations/20250405004036_set_utc_datetime.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index cd8fddf..2a591a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # v0.9.14 - Update deps - Fix wrapping issues with search bars +- Improve accuracy of timestamps # v0.9.13 - Add button to resend email verification email diff --git a/config/config.exs b/config/config.exs index b833665..3ff48a9 100644 --- a/config/config.exs +++ b/config/config.exs @@ -10,7 +10,7 @@ import Config config :cannery, env: :dev, ecto_repos: [Cannery.Repo], - generators: [binary_id: true, timestamp_type: :utc_datetime] + generators: [binary_id: true, timestamp_type: :utc_datetime_usec] config :cannery, Cannery.Accounts, registration: System.get_env("REGISTRATION", "invite") diff --git a/lib/cannery.ex b/lib/cannery.ex index b4668e2..c74bcc6 100644 --- a/lib/cannery.ex +++ b/lib/cannery.ex @@ -27,6 +27,7 @@ defmodule Cannery do @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id + @timestamps_opts [type: :utc_datetime_usec] end end diff --git a/lib/cannery/accounts/invite.ex b/lib/cannery/accounts/invite.ex index 0e5b920..864c5c2 100644 --- a/lib/cannery/accounts/invite.ex +++ b/lib/cannery/accounts/invite.ex @@ -11,13 +11,13 @@ defmodule Cannery.Accounts.Invite do field :name, :string field :token, :string field :uses_left, :integer, default: nil - field :disabled_at, :naive_datetime + field :disabled_at, :utc_datetime_usec belongs_to :created_by, User has_many :users, User - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -25,12 +25,12 @@ defmodule Cannery.Accounts.Invite do name: String.t(), token: token(), uses_left: integer() | nil, - disabled_at: NaiveDateTime.t(), + disabled_at: DateTime.t(), created_by: User.t() | nil | Association.NotLoaded.t(), created_by_id: User.id() | nil, users: [User.t()] | Association.NotLoaded.t(), - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_invite :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/accounts/invites.ex b/lib/cannery/accounts/invites.ex index 26eb41a..96afdcf 100644 --- a/lib/cannery/accounts/invites.ex +++ b/lib/cannery/accounts/invites.ex @@ -123,7 +123,7 @@ defmodule Cannery.Accounts.Invites do end defp decrement_invite_changeset(%Invite{uses_left: 1} = invite) do - now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + now = DateTime.utc_now() invite |> Invite.update_changeset(%{uses_left: 0, disabled_at: now}) end diff --git a/lib/cannery/accounts/user.ex b/lib/cannery/accounts/user.ex index 57f59c0..ae19daa 100644 --- a/lib/cannery/accounts/user.ex +++ b/lib/cannery/accounts/user.ex @@ -22,7 +22,7 @@ defmodule Cannery.Accounts.User do field :password, :string, virtual: true field :hashed_password, :string field :current_password, :string, virtual: true, redact: true - field :confirmed_at, :naive_datetime + field :confirmed_at, :utc_datetime_usec field :role, Ecto.Enum, values: [:admin, :user], default: :user field :locale, :string @@ -30,7 +30,7 @@ defmodule Cannery.Accounts.User do belongs_to :invite, Invite - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %User{ @@ -38,14 +38,14 @@ defmodule Cannery.Accounts.User do email: String.t(), password: String.t(), hashed_password: String.t(), - confirmed_at: NaiveDateTime.t(), + confirmed_at: DateTime.t(), role: role(), locale: String.t() | nil, created_invites: [Invite.t()] | Association.NotLoaded.t(), invite: Invite.t() | nil | Association.NotLoaded.t(), invite_id: Invite.id() | nil, - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_user :: %User{} @type id :: UUID.t() @@ -168,7 +168,7 @@ defmodule Cannery.Accounts.User do """ @spec confirm_changeset(t() | changeset()) :: changeset() def confirm_changeset(user_or_changeset) do - now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + now = DateTime.utc_now() user_or_changeset |> change(confirmed_at: now) end diff --git a/lib/cannery/accounts/user_token.ex b/lib/cannery/accounts/user_token.ex index 3c5972a..63ab253 100644 --- a/lib/cannery/accounts/user_token.ex +++ b/lib/cannery/accounts/user_token.ex @@ -32,7 +32,7 @@ defmodule Cannery.Accounts.UserToken do sent_to: String.t(), user: User.t() | Association.NotLoaded.t(), user_id: User.id() | nil, - inserted_at: NaiveDateTime.t() + inserted_at: DateTime.t() } @type new_user_token :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/activity_log/shot_record.ex b/lib/cannery/activity_log/shot_record.ex index 2c04c84..50413dc 100644 --- a/lib/cannery/activity_log/shot_record.ex +++ b/lib/cannery/activity_log/shot_record.ex @@ -24,7 +24,7 @@ defmodule Cannery.ActivityLog.ShotRecord do field :user_id, :binary_id field :pack_id, :binary_id - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -34,8 +34,8 @@ defmodule Cannery.ActivityLog.ShotRecord do date: Date.t() | nil, pack_id: Pack.id(), user_id: User.id(), - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_shot_record :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/ammo.ex b/lib/cannery/ammo.ex index 1dbbff6..923a005 100644 --- a/lib/cannery/ammo.ex +++ b/lib/cannery/ammo.ex @@ -920,7 +920,7 @@ defmodule Cannery.Ammo do multiplier <= @pack_create_limit and type_id |> is_binary() and container_id |> is_binary() do - now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + now = DateTime.utc_now() changesets = Enum.map(1..multiplier, fn _count -> diff --git a/lib/cannery/ammo/pack.ex b/lib/cannery/ammo/pack.ex index efa3577..b7483b4 100644 --- a/lib/cannery/ammo/pack.ex +++ b/lib/cannery/ammo/pack.ex @@ -30,7 +30,7 @@ defmodule Cannery.Ammo.Pack do field :container_id, :binary_id field :user_id, :binary_id - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -44,8 +44,8 @@ defmodule Cannery.Ammo.Pack do type_id: Type.id(), container_id: Container.id(), user_id: User.id(), - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_pack :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/ammo/type.ex b/lib/cannery/ammo/type.ex index e2351b9..42a0e40 100644 --- a/lib/cannery/ammo/type.ex +++ b/lib/cannery/ammo/type.ex @@ -90,7 +90,7 @@ defmodule Cannery.Ammo.Type do field :user_id, :binary_id has_many :packs, Pack - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -129,8 +129,8 @@ defmodule Cannery.Ammo.Type do dram_equivalent: String.t() | nil, user_id: User.id(), packs: [Pack.t()] | nil, - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_type :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/containers/container.ex b/lib/cannery/containers/container.ex index 67ee85e..96c813a 100644 --- a/lib/cannery/containers/container.ex +++ b/lib/cannery/containers/container.ex @@ -27,7 +27,7 @@ defmodule Cannery.Containers.Container do many_to_many :tags, Tag, join_through: ContainerTag - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -39,8 +39,8 @@ defmodule Cannery.Containers.Container do type: String.t(), user_id: User.id(), tags: [Tag.t()] | nil, - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_container :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/containers/container_tag.ex b/lib/cannery/containers/container_tag.ex index 9b72bdb..c8242b2 100644 --- a/lib/cannery/containers/container_tag.ex +++ b/lib/cannery/containers/container_tag.ex @@ -11,7 +11,7 @@ defmodule Cannery.Containers.ContainerTag do belongs_to :container, Container belongs_to :tag, Tag - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -20,8 +20,8 @@ defmodule Cannery.Containers.ContainerTag do container_id: Container.id(), tag: Tag.t(), tag_id: Tag.id(), - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_container_tag :: %__MODULE__{} @type id :: UUID.t() diff --git a/lib/cannery/containers/tag.ex b/lib/cannery/containers/tag.ex index 127a1d6..315340b 100644 --- a/lib/cannery/containers/tag.ex +++ b/lib/cannery/containers/tag.ex @@ -20,7 +20,7 @@ defmodule Cannery.Containers.Tag do field :user_id, :binary_id - timestamps(type: :utc_datetime) + timestamps(type: :utc_datetime_usec) end @type t :: %__MODULE__{ @@ -29,8 +29,8 @@ defmodule Cannery.Containers.Tag do bg_color: String.t(), text_color: String.t(), user_id: User.id(), - inserted_at: NaiveDateTime.t(), - updated_at: NaiveDateTime.t() + inserted_at: DateTime.t(), + updated_at: DateTime.t() } @type new_tag() :: %__MODULE__{} @type id() :: UUID.t() diff --git a/lib/cannery_web/components/core_components.ex b/lib/cannery_web/components/core_components.ex index f58c562..6220877 100644 --- a/lib/cannery_web/components/core_components.ex +++ b/lib/cannery_web/components/core_components.ex @@ -136,7 +136,7 @@ defmodule CanneryWeb.CoreComponents do attr :datetime, :any, required: true, doc: "A `DateTime` struct or nil" @doc """ - Phoenix.Component for a