Allow setting title, private and snapshot_at at asciicast creation

ex-snapshot
Marcin Kulik 7 years ago
parent 7de966bc3d
commit 64a690d144

@ -21,11 +21,10 @@ defmodule Asciinema.Asciicasts do
Repo.one!(q)
end
def create_asciicast(user, params, user_agent \\ nil)
def create_asciicast(user, params, overrides \\ %{})
def create_asciicast(user, %Plug.Upload{path: path, filename: filename} = upload, user_agent) do
def create_asciicast(user, %Plug.Upload{path: path, filename: filename} = upload, overrides) do
asciicast = %Asciicast{user_id: user.id,
user_agent: user_agent,
file: filename,
private: user.asciicasts_private_by_default}
@ -34,6 +33,7 @@ defmodule Asciinema.Asciicasts do
with {:ok, json} <- File.read(path),
{:ok, attrs} <- Poison.decode(json),
{:ok, attrs} <- extract_attrs(attrs),
attrs = Map.merge(attrs, overrides),
changeset = Asciicast.create_changeset(asciicast, attrs),
{:ok, %Asciicast{} = asciicast} <- do_create_asciicast(changeset, files) do
generate_poster(asciicast)
@ -46,16 +46,17 @@ defmodule Asciinema.Asciicasts do
end
end
def create_asciicast(user, %{"meta" => attrs,
def create_asciicast(user, %{"meta" => meta,
"stdout" => %Plug.Upload{} = data,
"stdout_timing" => %Plug.Upload{} = timing}, user_agent) do
"stdout_timing" => %Plug.Upload{} = timing}, overrides) do
asciicast = %Asciicast{user_id: user.id,
user_agent: unless(attrs["uname"], do: user_agent),
stdout_data: data.filename,
stdout_timing: timing.filename,
private: user.asciicasts_private_by_default}
attrs = Map.put(attrs, "version", 0)
{:ok, attrs} = extract_attrs(meta)
attrs = Map.merge(attrs, overrides)
attrs = if attrs[:uname], do: Map.drop(attrs, [:user_agent]), else: attrs
changeset = Asciicast.create_changeset(asciicast, attrs)
files = [{:stdout_data, data}, {:stdout_timing, timing}]
@ -68,15 +69,29 @@ defmodule Asciinema.Asciicasts do
end
end
defp extract_attrs(%{"version" => 1} = attrs) do
attrs = %{version: attrs["version"],
defp extract_attrs(%{"version" => 0} = attrs) do
attrs = %{version: 0,
terminal_columns: get_in(attrs, ["term", "columns"]),
terminal_lines: get_in(attrs, ["term", "lines"]),
terminal_type: get_in(attrs, ["term", "type"]),
command: attrs["command"],
duration: attrs["duration"],
title: attrs["title"],
shell: attrs["shell"],
uname: attrs["uname"]}
{:ok, attrs}
end
defp extract_attrs(%{"version" => 1} = attrs) do
attrs = %{version: 1,
terminal_columns: attrs["width"],
terminal_lines: attrs["height"],
terminal_type: get_in(attrs, ["env", "TERM"]),
command: attrs["command"],
shell: get_in(attrs, ["env", "SHELL"]),
title: attrs["title"]}
duration: attrs["duration"],
title: attrs["title"],
shell: get_in(attrs, ["env", "SHELL"])}
{:ok, attrs}
end
defp extract_attrs(_attrs) do

@ -1,7 +1,7 @@
defmodule Asciinema.Users do
import Ecto.Query, warn: false
import Ecto, only: [assoc: 2]
alias Asciinema.{Repo, User, ApiToken, Asciicasts, Asciicast}
alias Asciinema.{Repo, User, ApiToken, Asciicasts}
def create_asciinema_user!() do
attrs = %{username: "asciinema",
@ -22,13 +22,7 @@ defmodule Asciinema.Users do
filename: "asciicast.json",
content_type: "application/json"}
Repo.transaction(fn ->
{:ok, asciicast} = Asciicasts.create_asciicast(user, upload, nil)
asciicast
|> Asciicast.update_changeset(%{private: false, snapshot_at: 76.2})
|> Repo.update!
end)
{:ok, _} = Asciicasts.create_asciicast(user, upload, %{private: false, snapshot_at: 76.2})
end
:ok

@ -5,12 +5,13 @@ defmodule Asciinema.AsciicastsTest do
describe "create_asciicast/3" do
test "json file, v0 format with uname" do
user = fixture(:user)
params = %{"meta" => %{"command" => "/bin/bash",
params = %{"meta" => %{"version" => 0,
"command" => "/bin/bash",
"duration" => 11.146430015564,
"shell" => "/bin/zsh",
"terminal_columns" => 96,
"terminal_lines" => 26,
"terminal_type" => "screen-256color",
"term" => %{"columns" => 96,
"lines" => 26,
"type" => "screen-256color"},
"title" => "bashing :)",
"uname" => "Linux 3.9.9-302.fc19.x86_64 #1 SMP Sat Jul 6 13:41:07 UTC 2013 x86_64"},
"stdout" => fixture(:upload, %{path: "0.9.7/stdout",
@ -18,7 +19,7 @@ defmodule Asciinema.AsciicastsTest do
"stdout_timing" => fixture(:upload, %{path: "0.9.7/stdout.time",
content_type: "application/octet-stream"})}
{:ok, asciicast} = Asciicasts.create_asciicast(user, params, "a/user/agent")
{:ok, asciicast} = Asciicasts.create_asciicast(user, params, %{user_agent: "a/user/agent"})
assert %Asciicast{version: 0,
file: nil,
@ -37,19 +38,20 @@ defmodule Asciinema.AsciicastsTest do
test "json file, v0 format without uname" do
user = fixture(:user)
params = %{"meta" => %{"command" => "/bin/bash",
params = %{"meta" => %{"version" => 0,
"command" => "/bin/bash",
"duration" => 11.146430015564,
"shell" => "/bin/zsh",
"terminal_columns" => 96,
"terminal_lines" => 26,
"terminal_type" => "screen-256color",
"term" => %{"columns" => 96,
"lines" => 26,
"type" => "screen-256color"},
"title" => "bashing :)"},
"stdout" => fixture(:upload, %{path: "0.9.8/stdout",
content_type: "application/octet-stream"}),
"stdout_timing" => fixture(:upload, %{path: "0.9.8/stdout.time",
content_type: "application/octet-stream"})}
{:ok, asciicast} = Asciicasts.create_asciicast(user, params, "a/user/agent")
{:ok, asciicast} = Asciicasts.create_asciicast(user, params, %{user_agent: "a/user/agent"})
assert %Asciicast{version: 0,
file: nil,
@ -70,7 +72,7 @@ defmodule Asciinema.AsciicastsTest do
user = fixture(:user)
upload = fixture(:upload, %{path: "1/asciicast.json"})
{:ok, asciicast} = Asciicasts.create_asciicast(user, upload, "a/user/agent")
{:ok, asciicast} = Asciicasts.create_asciicast(user, upload, %{user_agent: "a/user/agent"})
assert %Asciicast{version: 1,
file: "asciicast.json",

@ -19,7 +19,7 @@ defmodule Asciinema.Api.AsciicastController do
user = conn.assigns.current_user
user_agent = conn |> get_req_header("user-agent") |> List.first
case Asciicasts.create_asciicast(user, params, user_agent) do
case Asciicasts.create_asciicast(user, params, %{user_agent: user_agent}) do
{:ok, asciicast} ->
url = asciicast_url(conn, :show, asciicast)
conn
@ -43,10 +43,9 @@ defmodule Asciinema.Api.AsciicastController do
defp parse_v0_params(%Plug.Conn{params: %{"asciicast" => %{"meta" => %Plug.Upload{path: meta_path}}}} = conn, _) do
with {:ok, json} <- File.read(meta_path),
{:ok, attrs} <- Poison.decode(json),
{:ok, meta} <- extract_v0_attrs(attrs) do
{:ok, attrs} <- Poison.decode(json) do
conn
|> put_param(["asciicast", "meta"], meta)
|> put_param(["asciicast", "meta"], Map.put(attrs, "version", 0))
|> put_basic_auth(attrs["username"], attrs["user_token"])
else
{:error, :invalid} ->
@ -60,17 +59,6 @@ defmodule Asciinema.Api.AsciicastController do
%{conn | params: params}
end
defp extract_v0_attrs(attrs) do
attrs = Map.merge(
Map.take(attrs, ["command", "duration", "shell", "title", "uname"]),
%{"terminal_columns" => get_in(attrs, ["term", "columns"]),
"terminal_lines" => get_in(attrs, ["term", "lines"]),
"terminal_type" => get_in(attrs, ["term", "type"])}
)
{:ok, attrs}
end
defp authenticate(conn, _opts) do
with {username, api_token} <- get_basic_auth(conn),
{:ok, %User{} = user} <- Users.get_user_with_api_token(api_token, username) do

@ -40,16 +40,24 @@ defmodule Asciinema.Asciicast do
end
end
def changeset(struct, attrs) do
struct
|> cast(attrs, [:title, :private, :snapshot_at])
|> validate_required([:private])
end
def create_changeset(struct, attrs) do
struct
|> cast(attrs, [:version, :file, :duration, :terminal_columns, :terminal_lines, :terminal_type, :command, :shell, :title, :uname])
|> validate_required([:user_id, :private, :version, :duration, :terminal_columns, :terminal_lines])
|> changeset(attrs)
|> cast(attrs, [:version, :file, :duration, :terminal_columns, :terminal_lines, :terminal_type, :command, :shell, :uname, :user_agent])
|> validate_required([:user_id, :version, :duration, :terminal_columns, :terminal_lines])
|> generate_secret_token
end
def update_changeset(struct, attrs) do
struct
|> cast(attrs, [:title, :theme_name, :private, :snapshot_at])
|> changeset(attrs)
|> cast(attrs, [:theme_name])
end
defp generate_secret_token(changeset) do

Loading…
Cancel
Save