forked from shibao/cannery
		
	add json export in settings
This commit is contained in:
		@@ -9,6 +9,14 @@ defmodule Cannery.Accounts.User do
 | 
			
		||||
  alias Ecto.{Changeset, UUID}
 | 
			
		||||
  alias Cannery.{Accounts.User, Invites.Invite}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :email,
 | 
			
		||||
             :confirmed_at,
 | 
			
		||||
             :role,
 | 
			
		||||
             :locale
 | 
			
		||||
           ]}
 | 
			
		||||
  @derive {Inspect, except: [:password]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,14 @@ defmodule Cannery.ActivityLog.ShotGroup do
 | 
			
		||||
  alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo}
 | 
			
		||||
  alias Ecto.{Changeset, UUID}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :count,
 | 
			
		||||
             :date,
 | 
			
		||||
             :notes,
 | 
			
		||||
             :ammo_group_id
 | 
			
		||||
           ]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
  schema "shot_groups" do
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,16 @@ defmodule Cannery.Ammo.AmmoGroup do
 | 
			
		||||
  alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Containers.Container}
 | 
			
		||||
  alias Ecto.{Changeset, UUID}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :count,
 | 
			
		||||
             :notes,
 | 
			
		||||
             :price_paid,
 | 
			
		||||
             :staged,
 | 
			
		||||
             :ammo_type_id,
 | 
			
		||||
             :container_id
 | 
			
		||||
           ]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
  schema "ammo_groups" do
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,31 @@ defmodule Cannery.Ammo.AmmoType do
 | 
			
		||||
  alias Cannery.Ammo.{AmmoGroup, AmmoType}
 | 
			
		||||
  alias Ecto.{Changeset, UUID}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :name,
 | 
			
		||||
             :desc,
 | 
			
		||||
             :bullet_type,
 | 
			
		||||
             :bullet_core,
 | 
			
		||||
             :cartridge,
 | 
			
		||||
             :caliber,
 | 
			
		||||
             :case_material,
 | 
			
		||||
             :jacket_type,
 | 
			
		||||
             :muzzle_velocity,
 | 
			
		||||
             :powder_type,
 | 
			
		||||
             :powder_grains_per_charge,
 | 
			
		||||
             :grains,
 | 
			
		||||
             :pressure,
 | 
			
		||||
             :primer_type,
 | 
			
		||||
             :firing_type,
 | 
			
		||||
             :tracer,
 | 
			
		||||
             :incendiary,
 | 
			
		||||
             :blank,
 | 
			
		||||
             :corrosive,
 | 
			
		||||
             :manufacturer,
 | 
			
		||||
             :upc
 | 
			
		||||
           ]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
  schema "ammo_types" do
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,15 @@ defmodule Cannery.Containers.Container do
 | 
			
		||||
  alias Cannery.Containers.{Container, ContainerTag}
 | 
			
		||||
  alias Cannery.{Accounts.User, Ammo.AmmoGroup, Tags.Tag}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :name,
 | 
			
		||||
             :desc,
 | 
			
		||||
             :location,
 | 
			
		||||
             :type,
 | 
			
		||||
             :tags
 | 
			
		||||
           ]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
  schema "containers" do
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,13 @@ defmodule Cannery.Tags.Tag do
 | 
			
		||||
  alias Ecto.{Changeset, UUID}
 | 
			
		||||
  alias Cannery.{Accounts.User, Tags.Tag}
 | 
			
		||||
 | 
			
		||||
  @derive {Jason.Encoder,
 | 
			
		||||
           only: [
 | 
			
		||||
             :id,
 | 
			
		||||
             :name,
 | 
			
		||||
             :bg_color,
 | 
			
		||||
             :text_color
 | 
			
		||||
           ]}
 | 
			
		||||
  @primary_key {:id, :binary_id, autogenerate: true}
 | 
			
		||||
  @foreign_key_type :binary_id
 | 
			
		||||
  schema "tags" do
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								lib/cannery_web/controllers/export_controller.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								lib/cannery_web/controllers/export_controller.ex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
defmodule CanneryWeb.ExportController do
 | 
			
		||||
  use CanneryWeb, :controller
 | 
			
		||||
  alias Cannery.{ActivityLog, Ammo, Containers}
 | 
			
		||||
 | 
			
		||||
  def export(%{assigns: %{current_user: current_user}} = conn, %{"mode" => "json"}) do
 | 
			
		||||
    ammo_types =
 | 
			
		||||
      Ammo.list_ammo_types(current_user)
 | 
			
		||||
      |> Enum.map(fn ammo_type ->
 | 
			
		||||
        average_cost = ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user)
 | 
			
		||||
        round_count = ammo_type |> Ammo.get_round_count_for_ammo_type(current_user)
 | 
			
		||||
        used_count = ammo_type |> Ammo.get_used_count_for_ammo_type(current_user)
 | 
			
		||||
        ammo_group_count = ammo_type |> Ammo.get_ammo_groups_count_for_type(current_user, true)
 | 
			
		||||
 | 
			
		||||
        ammo_type
 | 
			
		||||
        |> Jason.encode!()
 | 
			
		||||
        |> Jason.decode!()
 | 
			
		||||
        |> Map.merge(%{
 | 
			
		||||
          "average_cost" => average_cost,
 | 
			
		||||
          "round_count" => round_count,
 | 
			
		||||
          "used_count" => used_count,
 | 
			
		||||
          "ammo_group_count" => ammo_group_count
 | 
			
		||||
        })
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
    ammo_groups =
 | 
			
		||||
      Ammo.list_ammo_groups(current_user, true)
 | 
			
		||||
      |> Enum.map(fn ammo_group ->
 | 
			
		||||
        used_count = ammo_group |> Ammo.get_used_count()
 | 
			
		||||
        percentage_remaining = ammo_group |> Ammo.get_percentage_remaining()
 | 
			
		||||
 | 
			
		||||
        ammo_group
 | 
			
		||||
        |> Jason.encode!()
 | 
			
		||||
        |> Jason.decode!()
 | 
			
		||||
        |> Map.merge(%{
 | 
			
		||||
          "used_count" => used_count,
 | 
			
		||||
          "percentage_remaining" => percentage_remaining
 | 
			
		||||
        })
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
    shot_groups = ActivityLog.list_shot_groups(current_user)
 | 
			
		||||
 | 
			
		||||
    containers =
 | 
			
		||||
      Containers.list_containers(current_user)
 | 
			
		||||
      |> Enum.map(fn container ->
 | 
			
		||||
        ammo_group_count = container |> Containers.get_container_ammo_group_count!()
 | 
			
		||||
        round_count = container |> Containers.get_container_rounds!()
 | 
			
		||||
 | 
			
		||||
        container
 | 
			
		||||
        |> Jason.encode!()
 | 
			
		||||
        |> Jason.decode!()
 | 
			
		||||
        |> Map.merge(%{
 | 
			
		||||
          "ammo_group_count" => ammo_group_count,
 | 
			
		||||
          "round_count" => round_count
 | 
			
		||||
        })
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
    json(conn, %{
 | 
			
		||||
      user: current_user,
 | 
			
		||||
      ammo_types: ammo_types,
 | 
			
		||||
      ammo_groups: ammo_groups,
 | 
			
		||||
      shot_groups: shot_groups,
 | 
			
		||||
      containers: containers
 | 
			
		||||
    })
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -138,7 +138,7 @@ defmodule CanneryWeb.HomeLive do
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            <p>0.5.5</p>
 | 
			
		||||
            <p>0.6.0</p>
 | 
			
		||||
            <i class="fas fa-md fa-info-circle"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </li>
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,7 @@ defmodule CanneryWeb.Router do
 | 
			
		||||
    put "/users/settings", UserSettingsController, :update
 | 
			
		||||
    delete "/users/settings/:id", UserSettingsController, :delete
 | 
			
		||||
    get "/users/settings/confirm_email/:token", UserSettingsController, :confirm_email
 | 
			
		||||
    get "/export/:mode", ExportController, :export
 | 
			
		||||
 | 
			
		||||
    live "/tags", TagLive.Index, :index
 | 
			
		||||
    live "/tags/new", TagLive.Index, :new
 | 
			
		||||
 
 | 
			
		||||
@@ -139,12 +139,22 @@
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <.link
 | 
			
		||||
    href={Routes.user_settings_path(@conn, :delete, @current_user)}
 | 
			
		||||
    method={:delete}
 | 
			
		||||
    class="btn btn-alert"
 | 
			
		||||
    data-confirm={dgettext("prompts", "Are you sure you want to delete your account?")}
 | 
			
		||||
  >
 | 
			
		||||
    <%= dgettext("actions", "Delete User") %>
 | 
			
		||||
  </.link>
 | 
			
		||||
  <div class="flex justify-center items-center">
 | 
			
		||||
    <.link
 | 
			
		||||
      href={Routes.export_path(@conn, :export, :json)}
 | 
			
		||||
      class="mx-4 my-2 btn btn-primary"
 | 
			
		||||
      target="_blank"
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Export Data as JSON") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
 | 
			
		||||
    <.link
 | 
			
		||||
      href={Routes.user_settings_path(@conn, :delete, @current_user)}
 | 
			
		||||
      method={:delete}
 | 
			
		||||
      class="mx-4 my-2 btn btn-alert"
 | 
			
		||||
      data-confirm={dgettext("prompts", "Are you sure you want to delete your account?")}
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Delete User") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user