rename to memex

This commit is contained in:
shibao 2022-07-25 19:31:54 -04:00
parent 65ec4286da
commit 1a423f703b
122 changed files with 416 additions and 416 deletions

View File

@ -1,6 +1,6 @@
kind: pipeline
type: docker
name: lokal
name: memex
steps:
- name: restore-cache
@ -18,7 +18,7 @@ steps:
- name: test
image: bitwalker/alpine-elixir-phoenix:1.13
environment:
TEST_DATABASE_URL: ecto://postgres:postgres@database/lokal_test
TEST_DATABASE_URL: ecto://postgres:postgres@database/memex_test
HOST: testing.example.tld
commands:
- mix local.rebar --force
@ -30,7 +30,7 @@ steps:
- name: build and publish stable
image: plugins/docker
settings:
repo: shibaobun/lokal
repo: shibaobun/memex
username:
from_secret: docker_username
password:
@ -43,7 +43,7 @@ steps:
- name: build and publish tagged version
image: plugins/docker
settings:
repo: shibaobun/lokal
repo: shibaobun/memex
username:
from_secret: docker_username
password:

2
.gitignore vendored
View File

@ -20,7 +20,7 @@ erl_crash.dump
*.ez
# Ignore package tarball (built via "mix hex.build").
lokal-*.tar
memex-*.tar
# If NPM crashes, it generates a log, let's ignore it too.
npm-debug.log

View File

@ -45,10 +45,10 @@ RUN chown nobody:nobody /app
USER nobody:nobody
COPY --from=build --chown=nobody:nobody /app/_build/prod/rel/lokal ./
COPY --from=build --chown=nobody:nobody /app/_build/prod/rel/memex ./
COPY --from=build --chown=nobody:nobody /app/priv /app/priv
RUN chmod +x /app/priv/random.sh
ENV HOME=/app
CMD ["bin/lokal", "start"]
CMD ["bin/memex", "start"]

View File

@ -58,7 +58,7 @@ liveSocket.connect()
window.liveSocket = liveSocket
// Copy to clipboard
window.addEventListener('lokal:clipcopy', (event) => {
window.addEventListener('memex:clipcopy', (event) => {
if ('clipboard' in navigator) {
const text = event.target.textContent
navigator.clipboard.writeText(text)

View File

@ -9,7 +9,7 @@ module.exports = {
colors: {
transparent: 'transparent',
current: 'currentColor',
primary: colors.indigo,
primary: colors.black,
black: colors.black,
white: colors.white,
gray: colors.neutral,

View File

@ -7,23 +7,23 @@
# General application configuration
import Config
config :lokal,
ecto_repos: [Lokal.Repo],
config :memex,
ecto_repos: [Memex.Repo],
generators: [binary_id: true]
# Configures the endpoint
config :lokal, LokalWeb.Endpoint,
config :memex, MemexWeb.Endpoint,
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
render_errors: [view: LokalWeb.ErrorView, accepts: ~w(html json), layout: false],
pubsub_server: Lokal.PubSub,
render_errors: [view: MemexWeb.ErrorView, accepts: ~w(html json), layout: false],
pubsub_server: Memex.PubSub,
live_view: [signing_salt: "zOLgd3lr"],
registration: System.get_env("REGISTRATION") || "invite"
config :lokal, Lokal.Application, automigrate: false
config :memex, Memex.Application, automigrate: false
config :lokal, :generators,
config :memex, :generators,
migration: true,
binary_id: true,
sample_binary_id: "11111111-1111-1111-1111-111111111111"
@ -35,7 +35,7 @@ config :lokal, :generators,
#
# For production it's recommended to configure a different adapter
# at the `config/runtime.exs`.
config :lokal, Lokal.Mailer, adapter: Swoosh.Adapters.Local
config :memex, Memex.Mailer, adapter: Swoosh.Adapters.Local
# Swoosh API client is needed for adapters other than SMTP.
config :swoosh, :api_client, false
@ -44,8 +44,8 @@ config :swoosh, :api_client, false
config :gettext, :default_locale, "en_US"
# Configure Oban
config :lokal, Oban,
repo: Lokal.Repo,
config :memex, Oban,
repo: Memex.Repo,
plugins: [Oban.Plugins.Pruner],
queues: [default: 10, mailers: 20]

View File

@ -1,7 +1,7 @@
import Config
# Configure your database
config :lokal, Lokal.Repo,
config :memex, Memex.Repo,
show_sensitive_data_on_connection_error: true,
pool_size: 10
@ -11,7 +11,7 @@ config :lokal, Lokal.Repo,
# The watchers configuration can be used to run external
# watchers to your application. For example, we use it
# with esbuild to bundle .js and .css sources.
config :lokal, LokalWeb.Endpoint,
config :memex, MemexWeb.Endpoint,
check_origin: false,
code_reloader: true,
debug_errors: true,
@ -54,13 +54,13 @@ config :lokal, LokalWeb.Endpoint,
# different ports.
# Watch static and templates for browser reloading.
config :lokal, LokalWeb.Endpoint,
config :memex, MemexWeb.Endpoint,
live_reload: [
patterns: [
~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
~r"priv/gettext/.*(po)$",
~r"lib/lokal_web/(live|views)/.*(ex)$",
~r"lib/lokal_web/templates/.*(eex)$"
~r"lib/memex_web/(live|views)/.*(ex)$",
~r"lib/memex_web/templates/.*(eex)$"
]
]

View File

@ -9,7 +9,7 @@ import Config
# manifest is generated by the `mix phx.digest` task,
# which you should run after static files are built and
# before starting your production server.
config :lokal, LokalWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
config :memex, MemexWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
# Do not print debug messages in production
config :logger, level: :info
@ -19,7 +19,7 @@ config :logger, level: :info
# To get SSL working, you will need to add the `https` key
# to the previous section and set your `:url` port to 443:
#
# config :lokal, LokalWeb.Endpoint,
# config :memex, MemexWeb.Endpoint,
# ...,
# url: [host: "example.com", port: 443],
# https: [
@ -43,7 +43,7 @@ config :logger, level: :info
# We also recommend setting `force_ssl` in your endpoint, ensuring
# no data is ever sent via http, always redirecting to https:
#
# config :lokal, LokalWeb.Endpoint,
# config :memex, MemexWeb.Endpoint,
# force_ssl: [hsts: true]
#
# Check `Plug.SSL` for all available options in `force_ssl`.

View File

@ -9,7 +9,7 @@ import Config
# Start the phoenix server if environment is set and running in a release
if System.get_env("PHX_SERVER") && System.get_env("RELEASE_NAME") do
config :lokal, LokalWeb.Endpoint, server: true
config :memex, MemexWeb.Endpoint, server: true
end
# Set default locale
@ -20,28 +20,28 @@ maybe_ipv6 = if System.get_env("ECTO_IPV6") == "true", do: [:inet6], else: []
database_url =
if config_env() == :test do
System.get_env("TEST_DATABASE_URL") ||
"ecto://postgres:postgres@localhost/lokal_test#{System.get_env("MIX_TEST_PARTITION")}"
"ecto://postgres:postgres@localhost/memex_test#{System.get_env("MIX_TEST_PARTITION")}"
else
System.get_env("DATABASE_URL") ||
"ecto://postgres:postgres@lokal-db/lokal"
"ecto://postgres:postgres@memex-db/memex"
end
host =
System.get_env("HOST") ||
raise "No hostname set! Must be the domain and tld like `lokal.bubbletea.dev`."
raise "No hostname set! Must be the domain and tld like `memex.bubbletea.dev`."
interface =
if config_env() in [:dev, :test],
do: {0, 0, 0, 0},
else: {0, 0, 0, 0, 0, 0, 0, 0}
config :lokal, Lokal.Repo,
config :memex, Memex.Repo,
# ssl: true,
url: database_url,
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
socket_options: maybe_ipv6
config :lokal, LokalWeb.Endpoint,
config :memex, MemexWeb.Endpoint,
url: [scheme: "https", host: host, port: 443],
http: [
# See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
@ -65,13 +65,13 @@ if config_env() == :prod do
You can generate one by calling: mix phx.gen.secret
"""
config :lokal, LokalWeb.Endpoint, secret_key_base: secret_key_base
config :memex, MemexWeb.Endpoint, secret_key_base: secret_key_base
# Automatically apply migrations
config :lokal, Lokal.Application, automigrate: true
config :memex, Memex.Application, automigrate: true
# Set up SMTP settings
config :lokal, Lokal.Mailer,
config :memex, Memex.Mailer,
adapter: Swoosh.Adapters.SMTP,
relay: System.get_env("SMTP_HOST") || raise("No SMTP_HOST set!"),
port: System.get_env("SMTP_PORT") || 587,
@ -79,14 +79,14 @@ if config_env() == :prod do
password: System.get_env("SMTP_PASSWORD") || raise("No SMTP_PASSWORD set!"),
ssl: System.get_env("SMTP_SSL") == "true",
email_from: System.get_env("EMAIL_FROM") || "no-reply@#{System.get_env("HOST")}",
email_name: System.get_env("EMAIL_NAME") || "Lokal"
email_name: System.get_env("EMAIL_NAME") || "Memex"
# ## Using releases
#
# If you are doing OTP releases, you need to instruct Phoenix
# to start each relevant endpoint:
#
# config :lokal, LokalWeb.Endpoint, server: true
# config :memex, MemexWeb.Endpoint, server: true
#
# Then you can assemble a release by calling `mix release`.
# See `mix help release` for more information.

View File

@ -8,19 +8,19 @@ config :bcrypt_elixir, :log_rounds, 1
# The MIX_TEST_PARTITION environment variable can be used
# to provide built-in test partitioning in CI environment.
# Run `mix help test` for more information.
config :lokal, Lokal.Repo,
config :memex, Memex.Repo,
pool: Ecto.Adapters.SQL.Sandbox,
pool_size: 10
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :lokal, LokalWeb.Endpoint,
config :memex, MemexWeb.Endpoint,
http: [ip: {0, 0, 0, 0}, port: 4002],
secret_key_base: "S3qq9QtUdsFtlYej+HTjAVN95uP5i5tf2sPYINWSQfCKJghFj2B1+wTAoljZyHOK",
server: false
# In test we don't send emails.
config :lokal, Lokal.Mailer, adapter: Swoosh.Adapters.Test
config :memex, Memex.Mailer, adapter: Swoosh.Adapters.Test
# Print only warnings and errors during test
config :logger, level: :warn
@ -29,4 +29,4 @@ config :logger, level: :warn
config :phoenix, :plug_init_mode, :runtime
# Disable Oban
config :lokal, Oban, queues: false, plugins: false
config :memex, Oban, queues: false, plugins: false

View File

@ -77,21 +77,21 @@ Check them out!
For development, I recommend setting environment variables with
[direnv](https://direnv.net).
By default, Lokal will always bind to all external IPv4 and IPv6 addresses in
By default, Memex will always bind to all external IPv4 and IPv6 addresses in
`dev` and `prod` mode, respectively. If you would like to use different values,
they will need to be overridden in `config/dev.exs` and `config/runtime.exs` for
`dev` and `prod` modes, respectively.
## `MIX_ENV=dev`
In `dev` mode, Lokal will listen for these environment variables at runtime.
In `dev` mode, Memex will listen for these environment variables at runtime.
- `HOST`: External url to generate links with. Set this especially if you're
behind a reverse proxy. Defaults to `localhost`. External URLs will always be
generated with `https://` and port `443`.
- `PORT`: Internal port to bind to. Defaults to `4000`.
- `DATABASE_URL`: Controls the database url to connect to. Defaults to
`ecto://postgres:postgres@localhost/lokal_dev`.
`ecto://postgres:postgres@localhost/memex_dev`.
- `ECTO_IPV6`: Controls if Ecto should use IPv6 to connect to PostgreSQL.
Defaults to `false`.
- `POOL_SIZE`: Controls the pool size to use with PostgreSQL. Defaults to `10`.
@ -100,20 +100,20 @@ In `dev` mode, Lokal will listen for these environment variables at runtime.
## `MIX_ENV=test`
In `test` mode (or in the Docker container), Lokal will listen for the same environment variables as dev mode, but also include the following at runtime:
In `test` mode (or in the Docker container), Memex will listen for the same environment variables as dev mode, but also include the following at runtime:
- `TEST_DATABASE_URL`: REPLACES `DATABASE_URL`. Controls the database url to
connect to. Defaults to `ecto://postgres:postgres@localhost/lokal_test`.
connect to. Defaults to `ecto://postgres:postgres@localhost/memex_test`.
- `MIX_TEST_PARTITION`: Only used if `TEST_DATABASE_URL` is not specified.
Appended to the default database url if you would like to partition your test
databases. Defaults to not set.
## `MIX_ENV=prod`
In `prod` mode (or in the Docker container), Lokal will listen for the same environment variables as dev mode, but also include the following at runtime:
In `prod` mode (or in the Docker container), Memex will listen for the same environment variables as dev mode, but also include the following at runtime:
- `SECRET_KEY_BASE`: Secret key base used to sign cookies. Must be generated
with `docker run -it shibaobun/lokal mix phx.gen.secret` and set for server to start.
with `docker run -it shibaobun/memex mix phx.gen.secret` and set for server to start.
- `SMTP_HOST`: The url for your SMTP email provider. Must be set
- `SMTP_PORT`: The port for your SMTP relay. Defaults to `587`.
- `SMTP_USERNAME`: The username for your SMTP relay. Must be set!
@ -121,4 +121,4 @@ In `prod` mode (or in the Docker container), Lokal will listen for the same envi
- `SMTP_SSL`: Set to `true` to enable SSL for emails. Defaults to `false`.
- `EMAIL_FROM`: Sets the sender email in sent emails. Defaults to
`no-reply@HOST` where `HOST` was previously defined.
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "Lokal".
- `EMAIL_NAME`: Sets the sender name in sent emails. Defaults to "Memex".

View File

@ -1,16 +1,16 @@
version: '3'
services:
lokal:
memex:
build:
context: .
container_name: lokal
container_name: memex
restart: always
environment:
# HOST must be set!
# - HOST=your.domain.com
- DATABASE_URL=ecto://postgres:postgres@lokal-db/lokal
# Use `docker run -it shibaobun/lokal /app/priv/random.sh` to generate a secret key base
- DATABASE_URL=ecto://postgres:postgres@memex-db/memex
# Use `docker run -it shibaobun/memex /app/priv/random.sh` to generate a secret key base
# - SECRET_KEY_BASE=change-me-this-is-really-important-seriously-change-it
# uncomment to enable public sign ups, not recommended
# - REGISTRATION=public
@ -24,21 +24,21 @@ services:
# optional, default is false
# - SMTP_SSL=false
# optional, default is format below
# - EMAIL_FROM=no-reply@lokal.example.tld
# optional, default is "Lokal"
# - EMAIL_NAME=Lokal
# - EMAIL_FROM=no-reply@memex.example.tld
# optional, default is "Memex"
# - EMAIL_NAME=Memex
expose:
- "4000"
depends_on:
- lokal-db
- memex-db
lokal-db:
memex-db:
image: postgres:13
container_name: lokal-db
container_name: memex-db
environment:
- POSTGRES_USER="postgres"
- POSTGRES_PASSWORD="postgres"
- POSTGRES_DB="lokal"
- POSTGRES_DB="memex"
restart: always
volumes:
- ./data:/var/lib/postgresql/data

View File

@ -1,8 +0,0 @@
defmodule LokalWeb.EmailView do
@moduledoc """
A view for email-related helper functions
"""
alias LokalWeb.{Endpoint, HomeLive}
use LokalWeb, :view
end

View File

@ -1,3 +0,0 @@
defmodule LokalWeb.PageView do
use LokalWeb, :view
end

View File

@ -1,4 +0,0 @@
defmodule LokalWeb.UserConfirmationView do
use LokalWeb, :view
alias Lokal.Accounts
end

View File

@ -1,3 +0,0 @@
defmodule LokalWeb.UserRegistrationView do
use LokalWeb, :view
end

View File

@ -1,4 +0,0 @@
defmodule LokalWeb.UserResetPasswordView do
use LokalWeb, :view
alias Lokal.Accounts
end

View File

@ -1,4 +0,0 @@
defmodule LokalWeb.UserSessionView do
use LokalWeb, :view
alias Lokal.Accounts
end

View File

@ -1,3 +0,0 @@
defmodule LokalWeb.UserSettingsView do
use LokalWeb, :view
end

View File

@ -1,6 +1,6 @@
defmodule Lokal do
defmodule Memex do
@moduledoc """
Lokal keeps the contexts that define your domain
Memex keeps the contexts that define your domain
and business logic.
Contexts are also responsible for managing your data, regardless

View File

@ -1,11 +1,11 @@
defmodule Lokal.Accounts do
defmodule Memex.Accounts do
@moduledoc """
The Accounts context.
"""
import Ecto.Query, warn: false
alias Lokal.{Mailer, Repo}
alias Lokal.Accounts.{User, UserToken}
alias Memex.{Mailer, Repo}
alias Memex.Accounts.{User, UserToken}
alias Ecto.{Changeset, Multi}
alias Oban.Job
@ -349,7 +349,7 @@ defmodule Lokal.Accounts do
"""
@spec allow_registration?() :: boolean()
def allow_registration? do
Application.get_env(:lokal, LokalWeb.Endpoint)[:registration] == "public" or
Application.get_env(:memex, MemexWeb.Endpoint)[:registration] == "public" or
list_users_by_role(:admin) |> Enum.empty?()
end

View File

@ -1,16 +1,16 @@
defmodule Lokal.Email do
defmodule Memex.Email do
@moduledoc """
Emails that can be sent using Swoosh.
You can find the base email templates at
`lib/Lokal_web/templates/layout/email.html.heex` for html emails and
`lib/Lokal_web/templates/layout/email.txt.heex` for text emails.
`lib/memex_web/templates/layout/email.html.heex` for html emails and
`lib/memex_web/templates/layout/email.txt.heex` for text emails.
"""
use Phoenix.Swoosh, view: LokalWeb.EmailView, layout: {LokalWeb.LayoutView, :email}
import LokalWeb.Gettext
alias Lokal.Accounts.User
alias LokalWeb.EmailView
use Phoenix.Swoosh, view: MemexWeb.EmailView, layout: {MemexWeb.LayoutView, :email}
import MemexWeb.Gettext
alias Memex.Accounts.User
alias MemexWeb.EmailView
@typedoc """
Represents an HTML and text body email that can be sent
@ -19,29 +19,29 @@ defmodule Lokal.Email do
@spec base_email(User.t(), String.t()) :: t()
defp base_email(%User{email: email}, subject) do
from = Application.get_env(:Lokal, Lokal.Mailer)[:email_from] || "noreply@localhost"
name = Application.get_env(:Lokal, Lokal.Mailer)[:email_name]
from = Application.get_env(:Memex, Memex.Mailer)[:email_from] || "noreply@localhost"
name = Application.get_env(:Memex, Memex.Mailer)[:email_name]
new() |> to(email) |> from({name, from}) |> subject(subject)
end
@spec generate_email(key :: String.t(), User.t(), attrs :: map()) :: t()
def generate_email("welcome", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Confirm your Lokal account"))
|> base_email(dgettext("emails", "Confirm your Memex account"))
|> render_body("confirm_email.html", %{user: user, url: url})
|> text_body(EmailView.render("confirm_email.txt", %{user: user, url: url}))
end
def generate_email("reset_password", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Reset your Lokal password"))
|> base_email(dgettext("emails", "Reset your Memex password"))
|> render_body("reset_password.html", %{user: user, url: url})
|> text_body(EmailView.render("reset_password.txt", %{user: user, url: url}))
end
def generate_email("update_email", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Update your Lokal email"))
|> base_email(dgettext("emails", "Update your Memex email"))
|> render_body("update_email.html", %{user: user, url: url})
|> text_body(EmailView.render("update_email.txt", %{user: user, url: url}))
end

View File

@ -1,10 +1,10 @@
defmodule Lokal.EmailWorker do
defmodule Memex.EmailWorker do
@moduledoc """
Oban worker that dispatches emails
"""
use Oban.Worker, queue: :mailers, tags: ["email"]
alias Lokal.{Accounts, Email, Mailer}
alias Memex.{Accounts, Email, Mailer}
@impl Oban.Worker
def perform(%Oban.Job{args: %{"email" => email, "user_id" => user_id, "attrs" => attrs}}) do

View File

@ -1,13 +1,13 @@
defmodule Lokal.Accounts.User do
defmodule Memex.Accounts.User do
@moduledoc """
A Lokal user
A Memex user
"""
use Ecto.Schema
import Ecto.Changeset
import LokalWeb.Gettext
import MemexWeb.Gettext
alias Ecto.{Changeset, UUID}
alias Lokal.{Accounts.User, Invites.Invite}
alias Memex.{Accounts.User, Invites.Invite}
@derive {Inspect, except: [:password]}
@primary_key {:id, :binary_id, autogenerate: true}
@ -84,7 +84,7 @@ defmodule Lokal.Accounts.User do
message: dgettext("errors", "must have the @ sign and no spaces")
)
|> validate_length(:email, max: 160)
|> unsafe_validate_unique(:email, Lokal.Repo)
|> unsafe_validate_unique(:email, Memex.Repo)
|> unique_constraint(:email)
end

View File

@ -1,4 +1,4 @@
defmodule Lokal.Accounts.UserNotifier do
defmodule Memex.Accounts.UserNotifier do
@moduledoc """
Contains templates and messages for user messages
"""

View File

@ -1,4 +1,4 @@
defmodule Lokal.Accounts.UserToken do
defmodule Memex.Accounts.UserToken do
@moduledoc """
Schema for a user's session token
"""
@ -22,7 +22,7 @@ defmodule Lokal.Accounts.UserToken do
field :token, :binary
field :context, :string
field :sent_to, :string
belongs_to :user, Lokal.Accounts.User
belongs_to :user, Memex.Accounts.User
timestamps(updated_at: false)
end
@ -34,7 +34,7 @@ defmodule Lokal.Accounts.UserToken do
"""
def build_session_token(user) do
token = :crypto.strong_rand_bytes(@rand_size)
{token, %Lokal.Accounts.UserToken{token: token, context: "session", user_id: user.id}}
{token, %Memex.Accounts.UserToken{token: token, context: "session", user_id: user.id}}
end
@doc """
@ -69,7 +69,7 @@ defmodule Lokal.Accounts.UserToken do
hashed_token = :crypto.hash(@hash_algorithm, token)
{Base.url_encode64(token, padding: false),
%Lokal.Accounts.UserToken{
%Memex.Accounts.UserToken{
token: hashed_token,
context: context,
sent_to: sent_to,
@ -129,17 +129,17 @@ defmodule Lokal.Accounts.UserToken do
Returns the given token with the given context.
"""
def token_and_context_query(token, context) do
from Lokal.Accounts.UserToken, where: [token: ^token, context: ^context]
from Memex.Accounts.UserToken, where: [token: ^token, context: ^context]
end
@doc """
Gets all tokens for the given user for the given contexts.
"""
def user_and_contexts_query(user, :all) do
from t in Lokal.Accounts.UserToken, where: t.user_id == ^user.id
from t in Memex.Accounts.UserToken, where: t.user_id == ^user.id
end
def user_and_contexts_query(user, [_ | _] = contexts) do
from t in Lokal.Accounts.UserToken, where: t.user_id == ^user.id and t.context in ^contexts
from t in Memex.Accounts.UserToken, where: t.user_id == ^user.id and t.context in ^contexts
end
end

View File

@ -1,4 +1,4 @@
defmodule Lokal.Application do
defmodule Memex.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
@ -9,28 +9,28 @@ defmodule Lokal.Application do
def start(_type, _args) do
children = [
# Start the Ecto repository
Lokal.Repo,
Memex.Repo,
# Start the Telemetry supervisor
LokalWeb.Telemetry,
MemexWeb.Telemetry,
# Start the PubSub system
{Phoenix.PubSub, name: Lokal.PubSub},
{Phoenix.PubSub, name: Memex.PubSub},
# Start the Endpoint (http/https)
LokalWeb.Endpoint,
MemexWeb.Endpoint,
# Add Oban
{Oban, oban_config()}
# Start a worker by calling: Lokal.Worker.start_link(arg)
# {Lokal.Worker, arg}
# Start a worker by calling: Memex.Worker.start_link(arg)
# {Memex.Worker, arg}
]
# Automatically migrate on start in prod
children =
if Application.get_env(:lokal, Lokal.Application, automigrate: false)[:automigrate],
do: children ++ [Lokal.Repo.Migrator],
if Application.get_env(:memex, Memex.Application, automigrate: false)[:automigrate],
do: children ++ [Memex.Repo.Migrator],
else: children
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Lokal.Supervisor]
opts = [strategy: :one_for_one, name: Memex.Supervisor]
Supervisor.start_link(children, opts)
end
@ -38,11 +38,11 @@ defmodule Lokal.Application do
# whenever the application is updated.
@impl true
def config_change(changed, _new, removed) do
LokalWeb.Endpoint.config_change(changed, removed)
MemexWeb.Endpoint.config_change(changed, removed)
:ok
end
defp oban_config do
Application.fetch_env!(:lokal, Oban)
Application.fetch_env!(:memex, Oban)
end
end

View File

@ -1,11 +1,11 @@
defmodule Lokal.Invites do
defmodule Memex.Invites do
@moduledoc """
The Invites context.
"""
import Ecto.Query, warn: false
alias Ecto.Changeset
alias Lokal.{Accounts.User, Invites.Invite, Repo}
alias Memex.{Accounts.User, Invites.Invite, Repo}
@invite_token_length 20

View File

@ -1,4 +1,4 @@
defmodule Lokal.Invites.Invite do
defmodule Memex.Invites.Invite do
@moduledoc """
An invite, created by an admin to allow someone to join their instance. An
invite can be enabled or disabled, and can have an optional number of uses if
@ -8,7 +8,7 @@ defmodule Lokal.Invites.Invite do
use Ecto.Schema
import Ecto.Changeset
alias Ecto.{Changeset, UUID}
alias Lokal.{Accounts.User, Invites.Invite}
alias Memex.{Accounts.User, Invites.Invite}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id

View File

@ -1,4 +1,4 @@
defmodule Lokal.Mailer do
defmodule Memex.Mailer do
@moduledoc """
Mailer adapter for emails
@ -6,8 +6,8 @@ defmodule Lokal.Mailer do
json with Jason, which restricts the use of structs.
"""
use Swoosh.Mailer, otp_app: :lokal
alias Lokal.{Accounts.User, EmailWorker}
use Swoosh.Mailer, otp_app: :memex
alias Memex.{Accounts.User, EmailWorker}
alias Oban.Job
@doc """

View File

@ -1,9 +1,9 @@
defmodule Lokal.Release do
defmodule Memex.Release do
@moduledoc """
Contains mix tasks that can used in generated releases
"""
@app :lokal
@app :memex
def rollback(repo, version) do
load_app()

View File

@ -1,5 +1,5 @@
defmodule Lokal.Repo do
defmodule Memex.Repo do
use Ecto.Repo,
otp_app: :lokal,
otp_app: :memex,
adapter: Ecto.Adapters.Postgres
end

View File

@ -1,4 +1,4 @@
defmodule Lokal.Repo.Migrator do
defmodule Memex.Repo.Migrator do
@moduledoc """
Genserver to automatically perform all migration on app start
"""
@ -16,7 +16,7 @@ defmodule Lokal.Repo.Migrator do
end
def migrate! do
path = Application.app_dir(:lokal, "priv/repo/migrations")
Ecto.Migrator.run(Lokal.Repo, path, :up, all: true)
path = Application.app_dir(:memex, "priv/repo/migrations")
Ecto.Migrator.run(Memex.Repo, path, :up, all: true)
end
end

View File

@ -1,12 +1,12 @@
defmodule LokalWeb do
defmodule MemexWeb do
@moduledoc """
The entrypoint for defining your web interface, such
as controllers, views, channels and so on.
This can be used in your application as:
use LokalWeb, :controller
use LokalWeb, :view
use MemexWeb, :controller
use MemexWeb, :view
The definitions below will be executed for every view,
controller, etc, so keep them short and clean, focused
@ -19,19 +19,19 @@ defmodule LokalWeb do
def controller do
quote do
use Phoenix.Controller, namespace: LokalWeb
use Phoenix.Controller, namespace: MemexWeb
import Plug.Conn
import LokalWeb.Gettext
alias LokalWeb.Router.Helpers, as: Routes
import MemexWeb.Gettext
alias MemexWeb.Router.Helpers, as: Routes
end
end
def view do
quote do
use Phoenix.View,
root: "lib/lokal_web/templates",
namespace: LokalWeb
root: "lib/memex_web/templates",
namespace: MemexWeb
# Import convenience functions from controllers
import Phoenix.Controller,
@ -45,9 +45,9 @@ defmodule LokalWeb do
def live_view do
quote do
use Phoenix.LiveView,
layout: {LokalWeb.LayoutView, "live.html"}
layout: {MemexWeb.LayoutView, "live.html"}
on_mount LokalWeb.InitAssigns
on_mount MemexWeb.InitAssigns
unquote(view_helpers())
end
end
@ -81,7 +81,7 @@ defmodule LokalWeb do
def channel do
quote do
use Phoenix.Channel
import LokalWeb.Gettext
import MemexWeb.Gettext
end
end
@ -96,8 +96,8 @@ defmodule LokalWeb do
# Import basic rendering functionality (render, render_layout, etc)
import Phoenix.View
import LokalWeb.{ErrorHelpers, Gettext, LiveHelpers, ViewHelpers}
alias LokalWeb.Router.Helpers, as: Routes
import MemexWeb.{ErrorHelpers, Gettext, LiveHelpers, ViewHelpers}
alias MemexWeb.Router.Helpers, as: Routes
end
end

View File

@ -1,10 +1,10 @@
defmodule LokalWeb.Components.InviteCard do
defmodule MemexWeb.Components.InviteCard do
@moduledoc """
Display card for an invite
"""
use LokalWeb, :component
alias LokalWeb.Endpoint
use MemexWeb, :component
alias MemexWeb.Endpoint
def invite_card(assigns) do
~H"""

View File

@ -1,4 +1,4 @@
defmodule LokalWeb.Components.TableComponent do
defmodule MemexWeb.Components.TableComponent do
@moduledoc """
Livecomponent that presents a resortable table
@ -19,7 +19,7 @@ defmodule LokalWeb.Components.TableComponent do
content.
"""
use LokalWeb, :live_component
use MemexWeb, :live_component
alias Phoenix.LiveView.Socket
@impl true

View File

@ -1,12 +1,12 @@
defmodule LokalWeb.Components.Topbar do
defmodule MemexWeb.Components.Topbar do
@moduledoc """
Component that renders a topbar with user functions/links
"""
use LokalWeb, :component
use MemexWeb, :component
alias Lokal.Accounts
alias LokalWeb.{Endpoint, HomeLive}
alias Memex.Accounts
alias MemexWeb.{Endpoint, HomeLive}
def topbar(assigns) do
assigns =
@ -16,7 +16,7 @@ defmodule LokalWeb.Components.Topbar do
<nav role="navigation" class="mb-8 px-8 py-4 w-full bg-primary-400">
<div class="flex flex-col sm:flex-row justify-between items-center">
<div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2">
<%= live_redirect("Lokal",
<%= live_redirect("Memex",
to: Routes.live_path(Endpoint, HomeLive),
class: "mx-2 my-1 leading-5 text-xl text-white hover:underline"
) %>

View File

@ -1,9 +1,9 @@
defmodule LokalWeb.Components.UserCard do
defmodule MemexWeb.Components.UserCard do
@moduledoc """
Display card for a user
"""
use LokalWeb, :component
use MemexWeb, :component
def user_card(assigns) do
~H"""

View File

@ -1,16 +1,16 @@
defmodule LokalWeb.EmailController do
defmodule MemexWeb.EmailController do
@moduledoc """
A dev controller used to develop on emails
"""
use LokalWeb, :controller
alias Lokal.Accounts.User
use MemexWeb, :controller
alias Memex.Accounts.User
plug :put_layout, {LokalWeb.LayoutView, :email}
plug :put_layout, {MemexWeb.LayoutView, :email}
@sample_assigns %{
email: %{subject: "Example subject"},
url: "https://lokal.bubbletea.dev/sample_url",
url: "https://memex.bubbletea.dev/sample_url",
user: %User{email: "sample@email.com"}
}

View File

@ -1,9 +1,9 @@
defmodule LokalWeb.HomeController do
defmodule MemexWeb.HomeController do
@moduledoc """
Controller for home page
"""
use LokalWeb, :controller
use MemexWeb, :controller
def index(conn, _params) do
render(conn, "index.html")

View File

@ -1,20 +1,20 @@
defmodule LokalWeb.UserAuth do
defmodule MemexWeb.UserAuth do
@moduledoc """
Functions for user session and authentication
"""
import Plug.Conn
import Phoenix.Controller
import LokalWeb.Gettext
alias Lokal.{Accounts, Accounts.User}
alias LokalWeb.HomeLive
alias LokalWeb.Router.Helpers, as: Routes
import MemexWeb.Gettext
alias Memex.{Accounts, Accounts.User}
alias MemexWeb.HomeLive
alias MemexWeb.Router.Helpers, as: Routes
# Make the remember me cookie valid for 60 days.
# If you want bump or reduce this value, also change
# the token expiry itself in UserToken.
@max_age 60 * 60 * 24 * 60
@remember_me_cookie "_lokal_web_user_remember_me"
@remember_me_cookie "_memex_web_user_remember_me"
@remember_me_options [sign: true, max_age: @max_age, same_site: "Lax"]
@doc """
@ -99,7 +99,7 @@ defmodule LokalWeb.UserAuth do
user_token && Accounts.delete_session_token(user_token)
if live_socket_id = get_session(conn, :live_socket_id) do
LokalWeb.Endpoint.broadcast(live_socket_id, "disconnect", %{})
MemexWeb.Endpoint.broadcast(live_socket_id, "disconnect", %{})
end
conn

View File

@ -1,8 +1,8 @@
defmodule LokalWeb.UserConfirmationController do
use LokalWeb, :controller
defmodule MemexWeb.UserConfirmationController do
use MemexWeb, :controller
import LokalWeb.Gettext
alias Lokal.Accounts
import MemexWeb.Gettext
alias Memex.Accounts
def new(conn, _params) do
render(conn, "new.html", page_title: gettext("Confirm your account"))

View File

@ -1,9 +1,9 @@
defmodule LokalWeb.UserRegistrationController do
use LokalWeb, :controller
import LokalWeb.Gettext
alias Lokal.{Accounts, Invites}
alias Lokal.Accounts.User
alias LokalWeb.{Endpoint, HomeLive}
defmodule MemexWeb.UserRegistrationController do
use MemexWeb, :controller
import MemexWeb.Gettext
alias Memex.{Accounts, Invites}
alias Memex.Accounts.User
alias MemexWeb.{Endpoint, HomeLive}
def new(conn, %{"invite" => invite_token}) do
invite = Invites.get_invite_by_token(invite_token)

View File

@ -1,7 +1,7 @@
defmodule LokalWeb.UserResetPasswordController do
use LokalWeb, :controller
defmodule MemexWeb.UserResetPasswordController do
use MemexWeb, :controller
alias Lokal.Accounts
alias Memex.Accounts
plug :get_user_by_reset_password_token when action in [:edit, :update]

View File

@ -1,8 +1,8 @@
defmodule LokalWeb.UserSessionController do
use LokalWeb, :controller
defmodule MemexWeb.UserSessionController do
use MemexWeb, :controller
alias Lokal.Accounts
alias LokalWeb.UserAuth
alias Memex.Accounts
alias MemexWeb.UserAuth
def new(conn, _params) do
render(conn, "new.html", error_message: nil, page_title: gettext("Log in"))

View File

@ -1,8 +1,8 @@
defmodule LokalWeb.UserSettingsController do
use LokalWeb, :controller
import LokalWeb.Gettext
alias Lokal.Accounts
alias LokalWeb.{HomeLive, UserAuth}
defmodule MemexWeb.UserSettingsController do
use MemexWeb, :controller
import MemexWeb.Gettext
alias Memex.Accounts
alias MemexWeb.{HomeLive, UserAuth}
plug :assign_email_and_password_changesets

View File

@ -1,12 +1,12 @@
defmodule LokalWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :lokal
defmodule MemexWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :memex
# The session will be stored in the cookie and signed,
# this means its contents can be read but not tampered with.
# Set :encryption_salt if you would also like to encrypt it.
@session_options [
store: :cookie,
key: "_lokal_key",
key: "_memex_key",
signing_salt: "fxAnJltS"
]
@ -18,7 +18,7 @@ defmodule LokalWeb.Endpoint do
# when deploying your static files in production.
plug Plug.Static,
at: "/",
from: :lokal,
from: :memex,
gzip: false,
only: ~w(css fonts images js favicon.ico robots.txt)
@ -28,7 +28,7 @@ defmodule LokalWeb.Endpoint do
socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
plug Phoenix.LiveReloader
plug Phoenix.CodeReloader
plug Phoenix.Ecto.CheckRepoStatus, otp_app: :lokal
plug Phoenix.Ecto.CheckRepoStatus, otp_app: :memex
end
plug Phoenix.LiveDashboard.RequestLogger,
@ -46,5 +46,5 @@ defmodule LokalWeb.Endpoint do
plug Plug.MethodOverride
plug Plug.Head
plug Plug.Session, @session_options
plug LokalWeb.Router
plug MemexWeb.Router
end

View File

@ -1,11 +1,11 @@
defmodule LokalWeb.Gettext do
defmodule MemexWeb.Gettext do
@moduledoc """
A module providing Internationalization with a gettext-based API.
By using [Gettext](https://hexdocs.pm/gettext),
your module gains a set of macros for translations, for example:
import LokalWeb.Gettext
import MemexWeb.Gettext
# Simple translation
gettext("Here is the string to translate")
@ -20,5 +20,5 @@ defmodule LokalWeb.Gettext do
See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
"""
use Gettext, otp_app: :lokal
use Gettext, otp_app: :memex
end

View File

@ -1,9 +1,9 @@
defmodule LokalWeb.HomeLive do
defmodule MemexWeb.HomeLive do
@moduledoc """
Liveview for the main home page
"""
use LokalWeb, :live_view
use MemexWeb, :live_view
@impl true
def mount(_params, _session, socket) do
@ -30,7 +30,7 @@ defmodule LokalWeb.HomeLive do
end
defp search(query) do
if not LokalWeb.Endpoint.config(:code_reloader) do
if not MemexWeb.Endpoint.config(:code_reloader) do
raise "action disabled when not in development"
end

View File

@ -1,9 +1,9 @@
<div class="flex flex-col justify-center items-center text-center space-y-4">
<h1 class="title text-primary-500 text-2xl">
<%= gettext("Welcome to Lokal") %>
<%= gettext("memex") %>
</h1>
<p class="title text-primary-500 text-lg">
<%= gettext("Shop from your community") %>
<%= gettext("filling this out later") %>
</p>
</div>