From 2b7f7849518e1dd07f492188d8b62f9842d71b3a Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Tue, 30 Aug 2022 13:10:23 -0700 Subject: [PATCH] Implemented very rudimentary sync conflict detection and api endpoint /conflicts. --- logsrv_api/lib/logsrv.ex | 59 ++++++++++++++++++++++++++++++-- logsrv_api/lib/logsrv/helpers.ex | 14 ++++++++ logsrv_api/lib/logsrv/router.ex | 9 +++++ 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 logsrv_api/lib/logsrv/helpers.ex diff --git a/logsrv_api/lib/logsrv.ex b/logsrv_api/lib/logsrv.ex index 22960c2..dc30094 100644 --- a/logsrv_api/lib/logsrv.ex +++ b/logsrv_api/lib/logsrv.ex @@ -4,11 +4,11 @@ defmodule Logsrv do """ def dir do - Application.get_env(:logsrv, :dir) + Application.get_env(:logsrv, :dir) <> "/" end def dir(subdir) do - "#{dir()}/#{subdir}" + "#{dir()}/#{subdir}/" end def journals do @@ -21,4 +21,59 @@ defmodule Logsrv do |> File.ls! end + def compare(fd) do + sync_conflict_fd = fd + orig_fd = fd + |> String.replace(~r/\.sync.*/,"\.md") + + sync_conflict = sync_conflict_fd |> File.read! + orig = orig_fd |> File.read! + + # FOR NOW, just return the diff + diff = orig + |> String.myers_difference(sync_conflict) + + diff + |> Kernel.inspect() + |> Jason.encode! + + end + + def conflicts do + {conflicts(journals()), conflicts(pages())} + end + + def conflicts(list) do + list + |> Enum.filter( fn (fd) -> + fd |> String.match?(~r/.*sync.*/) + end) + end + + def resolve_conflicts do + {journal_conflicts, pages_conflicts} = conflicts() + + [ + journal_conflicts + |> Enum.map( fn(fd) -> + %{ + :type => :journal, + :date => fd |> Logsrv.Helpers.to_date, + :file => fd, + :diff => compare(dir(:journals) <> fd), + } + end), + + pages_conflicts + |> Enum.map( fn(fd) -> + %{ + :type => :page, + :file => fd, + :diff => compare(dir(:pages) <> fd), + } end) + ] + |> List.flatten() + + end + end diff --git a/logsrv_api/lib/logsrv/helpers.ex b/logsrv_api/lib/logsrv/helpers.ex new file mode 100644 index 0000000..9383dbd --- /dev/null +++ b/logsrv_api/lib/logsrv/helpers.ex @@ -0,0 +1,14 @@ +defmodule Logsrv.Helpers do + + def moot do + "moo" + end + + def to_date(str) do + str + |> String.replace(~r/\..*/,"") + |> String.replace("_","-") + |> Date.from_iso8601!() + end + +end diff --git a/logsrv_api/lib/logsrv/router.ex b/logsrv_api/lib/logsrv/router.ex index 0ec0e25..d258b1b 100644 --- a/logsrv_api/lib/logsrv/router.ex +++ b/logsrv_api/lib/logsrv/router.ex @@ -45,6 +45,15 @@ defmodule Logsrv.Router do |> send_resp(200, pages) # Send a 200 OK response with the posts in the body end + get "/conflicts" do + conflicts = Logsrv.resolve_conflicts + |> Jason.encode! + + conn + |> put_resp_content_type("application/json") + |> send_resp(200, conflicts) # Send a 200 OK response with the conflicts + end + # Fallback handler when there was no match match _ do send_resp(conn, 404, "Not Found")