Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor proxy conversion #36

Merged
merged 31 commits into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ea4e4de
refactor(proxy_conversion): multiply by 1000 -> @ms_per_sec
unenglishable Nov 14, 2024
aeb5cf3
refactor(proxy_conversion): implement @limit_exceeded_error
unenglishable Nov 14, 2024
96bee50
Merge remote-tracking branch 'origin/main' into refactor-proxy-conver…
unenglishable Nov 26, 2024
6c40de6
refactor(proxy_conversion): consolidate model builds into one function
unenglishable Nov 26, 2024
7447735
refactor(controllers/post&thread): use new options form for build_model
unenglishable Nov 26, 2024
54cc0b9
style(): mix format
unenglishable Nov 26, 2024
e63f1f5
refactor(helpers/proxy_conversion): move build_model default case int…
unenglishable Nov 26, 2024
4e0aa86
refactor(proxy_conversion): combine build_model function heads
unenglishable Nov 26, 2024
86bd752
refactor(smf_query): migrate proxy_conversion to smf_query
unenglishable Dec 2, 2024
b295b73
fix(smf_query): pass empty build_model opts as %{}
unenglishable Dec 2, 2024
3366aa1
refactor(smf_query): separate extract_opts functionality into private…
unenglishable Dec 2, 2024
cca5b93
refactor(smf_query): remove board_counts() from build_model
unenglishable Dec 2, 2024
ba1e426
refactor(smf_query): remove board_last_post_info() from build_model
unenglishable Dec 2, 2024
d037520
refactor(smf_query): remove board_moderators() from build_model
unenglishable Dec 2, 2024
f33fd62
refactor(smf_query): remove recent_threads() from build_model
unenglishable Dec 2, 2024
217fba0
refactor(smf_query): remove unused build_model header
unenglishable Dec 2, 2024
0429eba
refactor(smf_query): remove category() from build_model
unenglishable Dec 2, 2024
40ebb14
refactor(smf_query): remove board() from build_model
unenglishable Dec 2, 2024
592d0af
refactor(smf_query): remove thread() from build_model
unenglishable Dec 2, 2024
9df19c6
refactor(smf_query): remove post() from build_model
unenglishable Dec 2, 2024
13cef99
refactor(smf_query): remove poll_by_thread() from build_model
unenglishable Dec 2, 2024
e43ae56
refactor(smf_query): remove find_user() from build_model
unenglishable Dec 2, 2024
a35ff1d
refactor(smf_query): remove unused build_model header
unenglishable Dec 2, 2024
554d71a
refactor(smf_query): remove threads_by_board() from build_model
unenglishable Dec 2, 2024
b29cd4b
refactor(smf_query): remove posts_by_thread() from build_model
unenglishable Dec 3, 2024
db7bd19
refactor(smf_query): remove threads_by_user() from build_model
unenglishable Dec 4, 2024
56acb74
refactor(smf_query): remove posts_by_user() from build_model
unenglishable Dec 4, 2024
7217962
refactor(controllers): limit -> per_page
unenglishable Dec 4, 2024
fdc1ce2
refactor(smf_query): remove unused build_model header
unenglishable Dec 4, 2024
819e77f
refactor(controllers): pass limit into per_page
unenglishable Dec 4, 2024
2d41119
Merge remote-tracking branch 'origin/main' into refactor-proxy-conver…
unenglishable Dec 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,91 +1,27 @@
defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
defmodule EpochtalkServer.SmfQuery do
import Ecto.Query
alias EpochtalkServer.SmfRepo
alias EpochtalkServerWeb.Helpers.ProxyPagination

@default_page 1
@default_per_page 25
@ms_per_sec 1000

@moduledoc """
Helper for pulling and formatting data from SmfRepo
"""

def build_model(model_type, ids, _, _) when is_nil(model_type) or is_nil(ids) do
{:ok, %{}, %{}}
end

def build_model(_, ids, _, _) when length(ids) > 25 do
{:error, "Limit too large, please try again"}
end

def build_model(model_type, id, page, per_page) when is_integer(id) do
case model_type do
"threads.by_board" ->
build_threads_by_board(id, page, per_page)

"posts.by_thread" ->
build_posts_by_thread(id, page, per_page)

_ ->
build_model(nil, nil, nil, nil)
end
end

def build_model(model_type, id, page, per_page, desc) when is_integer(id) do
case model_type do
"threads.by_user" ->
build_threads_by_user(id, page, per_page, desc)

"posts.by_user" ->
build_posts_by_user(id, page, per_page, desc)

_ ->
build_model(nil, nil, nil, nil)
end
end

def build_model(model_type, id) do
case model_type do
"category" ->
build_category(id)

"board" ->
build_board(id)

"thread" ->
build_thread(id)

"post" ->
build_post(id)
defp extract_opts(opts) do
default_opts = %{
page: @default_page,
per_page: @default_per_page,
desc: false
}

"poll.by_thread" ->
build_poll(id)

"user.find" ->
build_user(id)

_ ->
build_model(nil, nil, nil, nil)
end
end

def build_model(model_type) do
case model_type do
"boards.counts" ->
build_board_counts()

"boards.last_post_info" ->
build_board_last_post_info()

"boards.moderators" ->
build_board_moderators()

"threads.recent" ->
build_recent_threads()

_ ->
build_model(nil, nil, nil, nil)
end
Enum.into(opts, default_opts)
end

def build_user(user_id) do
def find_user(user_id) do
from(u in "smf_members", where: u.id_member == ^user_id)
|> join(:left, [u], a in "smf_attachments",
on: u.id_member == a.id_member and a.attachmentType == 1
Expand Down Expand Up @@ -126,7 +62,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
|> SmfRepo.one()
end

def build_poll(thread_id) do
def poll_by_thread(thread_id) do
from(t in "smf_topics",
where: t.id_topic == ^thread_id
)
Expand All @@ -135,7 +71,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
id: t.id_poll,
change_vote: p.changeVote,
display_mode: "always",
expiration: p.expireTime * 1000,
expiration: p.expireTime * @ms_per_sec,
has_voted: false,
locked: p.votingLocked == 1,
max_answers: p.maxVotes,
Expand Down Expand Up @@ -168,7 +104,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_recent_threads() do
def recent_threads() do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -193,8 +129,8 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
first_post_id: t.id_first_msg,
last_post_id: t.id_last_msg,
title: f.subject,
updated_at: l.posterTime * 1000,
last_post_created_at: l.posterTime * 1000,
updated_at: l.posterTime * @ms_per_sec,
last_post_created_at: l.posterTime * @ms_per_sec,
last_post_user_id: l.id_member,
last_post_username: l.posterName,
view_count: t.numViews,
Expand All @@ -215,7 +151,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_category(id) do
def category(id) do
from(c in "smf_categories",
where: c.id_cat == ^id,
select: %{
Expand All @@ -234,7 +170,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_board_counts() do
def board_counts() do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -256,7 +192,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_board_last_post_info() do
def board_last_post_info() do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -271,7 +207,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
)
|> select([b, m, t, u, a], %{
id: b.id_board,
last_post_created_at: m.posterTime * 1000,
last_post_created_at: m.posterTime * @ms_per_sec,
last_post_position: t.numReplies,
last_post_username: m.posterName,
last_post_user_id: m.id_member,
Expand All @@ -287,7 +223,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
last_thread_post_count: t.numReplies,
last_thread_slug: t.id_topic,
last_thread_title: m.subject,
last_thread_updated_at: m.posterTime * 1000
last_thread_updated_at: m.posterTime * @ms_per_sec
})
|> SmfRepo.all()
|> case do
Expand All @@ -299,7 +235,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_board_moderators() do
def board_moderators() do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -325,7 +261,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_board(id) do
def board(id) do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -351,7 +287,12 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_threads_by_board(id, page, per_page) do
def threads_by_board(id, opts) do
%{
page: page,
per_page: per_page
} = extract_opts(opts)

%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand Down Expand Up @@ -386,9 +327,9 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
title: f.subject,
user_id: f.id_member,
username: f.posterName,
created_at: f.posterTime * 1000,
created_at: f.posterTime * @ms_per_sec,
user_deleted: false,
last_post_created_at: l.posterTime * 1000,
last_post_created_at: l.posterTime * @ms_per_sec,
last_post_deleted: false,
last_post_user_id: l.id_member,
last_post_username: l.posterName,
Expand All @@ -406,7 +347,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
|> ProxyPagination.page_simple(count_query, page, per_page: per_page, desc: true)
end

def build_thread(id) do
def thread(id) do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -432,9 +373,9 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
title: f.subject,
user_id: f.id_member,
username: f.posterName,
created_at: f.posterTime * 1000,
created_at: f.posterTime * @ms_per_sec,
user_deleted: false,
last_post_created_at: l.posterTime * 1000,
last_post_created_at: l.posterTime * @ms_per_sec,
last_post_deleted: false,
last_post_user_id: l.id_member,
last_post_username: l.posterName,
Expand All @@ -451,7 +392,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_post(id) do
def post(id) do
%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -477,7 +418,12 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_posts_by_thread(id, page, per_page) do
def posts_by_thread(id, opts) do
%{
page: page,
per_page: per_page
} = extract_opts(opts)

%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand All @@ -503,7 +449,7 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
body: m.body,
updated_at: m.modifiedTime,
username: m.posterName,
created_at: m.posterTime * 1000,
created_at: m.posterTime * @ms_per_sec,
modified_time: m.modifiedTime,
avatar:
fragment(
Expand Down Expand Up @@ -531,7 +477,13 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
end
end

def build_posts_by_user(id, page, per_page, desc) do
def posts_by_user(id, opts) do
%{
page: page,
per_page: per_page,
desc: desc
} = extract_opts(opts)

%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand Down Expand Up @@ -564,7 +516,13 @@ defmodule EpochtalkServerWeb.Helpers.ProxyConversion do
|> ProxyPagination.page_simple(count_query, page, per_page: per_page, desc: desc)
end

def build_threads_by_user(id, page, per_page, desc) do
def threads_by_user(id, opts) do
%{
page: page,
per_page: per_page,
desc: desc
} = extract_opts(opts)

%{id_board_blacklist: id_board_blacklist} =
Application.get_env(:epochtalk_server, :proxy_config)

Expand Down
8 changes: 4 additions & 4 deletions lib/epochtalk_server_web/controllers/board.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ defmodule EpochtalkServerWeb.Controllers.Board do
alias EpochtalkServerWeb.ErrorHelpers
alias EpochtalkServerWeb.Helpers.Validate
alias EpochtalkServerWeb.Helpers.ACL
alias EpochtalkServerWeb.Helpers.ProxyConversion
alias EpochtalkServer.SmfQuery

plug :check_proxy when action in [:slug_to_id, :by_category]

Expand Down Expand Up @@ -150,9 +150,9 @@ defmodule EpochtalkServerWeb.Controllers.Board do
stripped <- Validate.cast(attrs, "stripped", :boolean, default: false),
user_priority <- ACL.get_user_priority(conn),
board_mapping <- BoardMapping.all(stripped: stripped),
{:ok, board_moderators} <- ProxyConversion.build_model("boards.moderators"),
{:ok, board_counts} <- ProxyConversion.build_model("boards.counts"),
{:ok, board_last_post_info} <- ProxyConversion.build_model("boards.last_post_info"),
{:ok, board_moderators} <- SmfQuery.board_moderators(),
{:ok, board_counts} <- SmfQuery.board_counts(),
{:ok, board_last_post_info} <- SmfQuery.board_last_post_info(),
categories <- Category.all() do
render(conn, :proxy_by_category, %{
categories: categories,
Expand Down
14 changes: 9 additions & 5 deletions lib/epochtalk_server_web/controllers/post.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ defmodule EpochtalkServerWeb.Controllers.Post do
alias EpochtalkServerWeb.Helpers.ACL
alias EpochtalkServerWeb.Helpers.Sanitize
alias EpochtalkServerWeb.Helpers.Parse
alias EpochtalkServerWeb.Helpers.ProxyConversion
alias EpochtalkServer.SmfQuery
alias EpochtalkServer.Models.Profile
alias EpochtalkServer.Models.Post
alias EpochtalkServer.Models.Poll
Expand Down Expand Up @@ -558,7 +558,11 @@ defmodule EpochtalkServerWeb.Controllers.Post do
limit <- Validate.cast(attrs, "limit", :integer, default: 25, min: 1, max: 100),
desc <- Validate.cast(attrs, "desc", :boolean, default: true),
{:ok, posts, data} <-
ProxyConversion.build_model("posts.by_user", user_id, page, limit, desc) do
SmfQuery.posts_by_user(user_id, %{
page: page,
per_page: limit,
desc: desc
}) do
render(conn, :proxy_by_username, %{
posts: posts,
count: data.total_records,
Expand All @@ -581,10 +585,10 @@ defmodule EpochtalkServerWeb.Controllers.Post do
:ok <- ACL.allow!(conn, "posts.byThread"),
board_mapping <- BoardMapping.all(),
board_moderators <- BoardModerator.all(),
thread <- ProxyConversion.build_model("thread", thread_id),
poll <- ProxyConversion.build_model("poll.by_thread", thread_id),
thread <- SmfQuery.thread(thread_id),
poll <- SmfQuery.poll_by_thread(thread_id),
{:ok, posts, data} <-
ProxyConversion.build_model("posts.by_thread", thread_id, page, limit) do
SmfQuery.posts_by_thread(thread_id, %{page: page, per_page: limit}) do
render(conn, :by_thread_proxy, %{
posts: posts,
poll: poll,
Expand Down
Loading
Loading