├── lib ├── athel_web │ ├── templates │ │ ├── page │ │ │ └── index.html.eex │ │ ├── article │ │ │ └── show.html.eex │ │ ├── admin │ │ │ └── new_group.html.eex │ │ ├── group │ │ │ ├── show.html.eex │ │ │ └── index.html.eex │ │ └── layout │ │ │ └── app.html.eex │ ├── views │ │ ├── layout_view.ex │ │ ├── page_view.ex │ │ ├── admin_view.ex │ │ ├── article_view.ex │ │ ├── group_view.ex │ │ ├── error_view.ex │ │ ├── view_common.ex │ │ └── error_helpers.ex │ ├── controllers │ │ ├── page_controller.ex │ │ ├── article_controller.ex │ │ ├── admin_controller.ex │ │ └── group_controller.ex │ ├── gettext.ex │ ├── router.ex │ ├── channels │ │ └── user_socket.ex │ └── endpoint.ex ├── athel │ ├── vault.ex │ ├── models │ │ ├── encrypted_binary_field.ex │ │ ├── role.ex │ │ ├── article_search_index.ex │ │ ├── foreigner.ex │ │ ├── group.ex │ │ ├── user.ex │ │ ├── attachment.ex │ │ └── article.ex │ ├── repo.ex │ ├── event │ │ ├── supervisor.ex │ │ ├── nntp_broadcaster.ex │ │ └── moderation_handler.ex │ ├── scraper_supervisor.ex │ ├── application.ex │ ├── nntp │ │ ├── supervisor.ex │ │ ├── defs.ex │ │ ├── formattable.ex │ │ ├── client.ex │ │ ├── protocol.ex │ │ └── parser.ex │ ├── user_cache.ex │ ├── services │ │ ├── auth_service.ex │ │ ├── multipart.ex │ │ └── nntp_service.ex │ └── scraper.ex ├── athel.ex └── athel_web.ex ├── test ├── nntp │ ├── scandavian_org.txt │ ├── formattable_test.exs │ └── parser_test.exs ├── services │ ├── danish_body.txt │ ├── auth_service_test.exs │ ├── nntp_service_test.exs │ └── multipart_test.exs ├── views │ ├── page_view_test.exs │ ├── layout_view_test.exs │ └── error_view_test.exs ├── test_helper.exs ├── controllers │ ├── page_controller_test.exs │ └── group_controller_test.exs ├── user_cache_test.exs ├── models │ ├── user_test.exs │ ├── group_test.exs │ ├── attachment_test.exs │ └── article_test.exs └── support │ ├── channel_case.ex │ ├── conn_case.ex │ ├── test_data.ex │ └── model_case.ex ├── README.md ├── todo.txt ├── priv ├── repo │ ├── migrations │ │ ├── 20180905024527_create_foreigners.exs │ │ ├── 20190329023750_create_role.exs │ │ ├── 20160819035916_create_attachment.exs │ │ ├── 20160810163507_create_user.exs │ │ ├── 20160718151737_create_group.exs │ │ ├── 20190226213046_article_full_text_search.exs │ │ └── 20160718181754_create_article.exs │ └── seeds.exs ├── keys │ ├── testing.cert │ ├── example.com.crt │ ├── example.com.key │ └── testing.key └── gettext │ ├── en │ └── LC_MESSAGES │ │ └── errors.po │ └── errors.pot ├── assets ├── package.json ├── brunch-config.js └── styles │ ├── app.less │ └── _normalize.less ├── LICENSE ├── .gitignore ├── config ├── prod.exs ├── test.exs ├── config.exs └── dev.exs ├── mix.exs ├── INSTALL.md ├── .credo.exs └── mix.lock /lib/athel_web/templates/page/index.html.eex: -------------------------------------------------------------------------------- 1 |
2 | Wording and words 3 |
4 | -------------------------------------------------------------------------------- /lib/athel/vault.ex: -------------------------------------------------------------------------------- 1 | defmodule Athel.Vault do 2 | use Cloak.Vault, otp_app: :athel 3 | end -------------------------------------------------------------------------------- /test/nntp/scandavian_org.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruhlio/athel/HEAD/test/nntp/scandavian_org.txt -------------------------------------------------------------------------------- /test/services/danish_body.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruhlio/athel/HEAD/test/services/danish_body.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Athel 2 | 3 | An NNTP backed messageboard 4 | 5 | # Running 6 | 7 | See [Running](./running.md) 8 | -------------------------------------------------------------------------------- /test/views/page_view_test.exs: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.PageViewTest do 2 | use AthelWeb.ConnCase, async: true 3 | end 4 | -------------------------------------------------------------------------------- /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start(timeout: 7_500) 2 | 3 | Ecto.Adapters.SQL.Sandbox.mode(Athel.Repo, :manual) 4 | 5 | -------------------------------------------------------------------------------- /test/views/layout_view_test.exs: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.LayoutViewTest do 2 | use AthelWeb.ConnCase, async: true 3 | end 4 | -------------------------------------------------------------------------------- /test/controllers/page_controller_test.exs: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.PageControllerTest do 2 | use AthelWeb.ConnCase, async: true 3 | end 4 | -------------------------------------------------------------------------------- /lib/athel/models/encrypted_binary_field.ex: -------------------------------------------------------------------------------- 1 | defmodule Athel.EncryptedBinaryField do 2 | use Cloak.Fields.Binary, vault: Athel.Vault 3 | end -------------------------------------------------------------------------------- /lib/athel/repo.ex: -------------------------------------------------------------------------------- 1 | defmodule Athel.Repo do 2 | use Ecto.Repo, 3 | otp_app: :athel, 4 | adapter: Ecto.Adapters.Postgres 5 | end 6 | -------------------------------------------------------------------------------- /lib/athel_web/views/layout_view.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.LayoutView do 2 | use AthelWeb, :view 3 | 4 | def title() do 5 | "Athel" 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/athel_web/views/page_view.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.PageView do 2 | use AthelWeb, :view 3 | 4 | def title(_, _) do 5 | "Home" 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/athel_web/views/admin_view.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.AdminView do 2 | use AthelWeb, :view 3 | 4 | def title(_, _) do 5 | "Admin" 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /todo.txt: -------------------------------------------------------------------------------- 1 | ban/delete by post/poster 2 | increment group watermarks 3 | configure logging to file 4 | implement moderated posting status 5 | add remote info to server/client logging 6 | -------------------------------------------------------------------------------- /lib/athel_web/views/article_view.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.ArticleView do 2 | use AthelWeb, :view 3 | 4 | def title(_, assigns) do 5 | List.first(assigns.articles).subject 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/athel_web/controllers/page_controller.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.PageController do 2 | use AthelWeb, :controller 3 | 4 | def index(conn, _params) do 5 | render conn, "index.html" 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/athel_web/views/group_view.ex: -------------------------------------------------------------------------------- 1 | defmodule AthelWeb.GroupView do 2 | use AthelWeb, :view 3 | 4 | def title("show.html", assigns) do 5 | assigns.group.name 6 | end 7 | def title(_t, _) do 8 | "Groups" 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /lib/athel.ex: -------------------------------------------------------------------------------- 1 | defmodule Athel do 2 | def model do 3 | quote do 4 | use Ecto.Schema 5 | use Timex.Ecto.Timestamps 6 | 7 | import Ecto 8 | import Ecto.Changeset 9 | import Ecto.Query 10 | end 11 | end 12 | 13 | end 14 | -------------------------------------------------------------------------------- /lib/athel/models/role.ex: -------------------------------------------------------------------------------- 1 | defmodule Athel.Role do 2 | use Ecto.Schema 3 | import Ecto.Changeset 4 | 5 | alias Athel.User 6 | 7 | @type t :: %__MODULE__{} 8 | 9 | @primary_key false 10 | schema "roles" do 11 | field :name, :string 12 | field :group_name, :string 13 | 14 | belongs_to :user, User, 15 | foreign_key: :user_email, 16 | references: :email, 17 | type: :string 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/athel_web/templates/article/show.html.eex: -------------------------------------------------------------------------------- 1 |No articles
5 | <% end %> 6 | 7 |No groups
5 | <% else %> 6 || Name | 9 |Low Watermark | 10 |High Watermark | 11 |Status | 12 |
|---|---|---|---|
| 16 | 17 | <%= group.name %> 18 | 19 | | 20 |21 | <%= group.low_watermark %> 22 | | 23 |24 | <%= group.high_watermark %> 25 | | 26 |27 | <%= case group.status do %> 28 | <% "y" -> %> 29 | Posting permitted 30 | <% "n" -> %> 31 | Posting not permitted 32 | <% "m" -> %> 33 | Posting moderated 34 | <% end %> 35 | | 36 |