/health-patient

Clojure CRUD App :P

Primary LanguageClojureMIT LicenseMIT

Health Patient: Clojure CRUD

Master CI

Simple web CRUD to manipulate patients. Application uses Clojure, ClojureScript (not for SPA), PostgreSQL and some cool libraries!

How to setup and run

The project requires Leiningen (2.0.0+).

Server REPL

# Setup env variables:
$ export HTTP_PORT=8080
$ export DATABASE_JDBC_URL=jdbc:postgresql://127.0.0.1:5432/health_patient?user=postgres&password=pass&stringtype=unspecified

# Start repl:
$ make install
$ make start

# Start server:
user=> (dev)            # Enter to development namespace
health-repl=> (start)   # Start systems (db connection, http server...)
health-repl=> (refresh) # Reload changed namespaces and restart systems

Docker database

If you want you can use PostgreSQL from Docker. It's easy:

$ make docker-build
$ make docker-db    # Database will run in background

Don't forget update DATABASE_JDBC_URL env variable if necessary

ClojureScript

$ make auto-frontend

Neovim

If you use Neovim and Conjure you can configurate your init.lua like this:

vim.g['conjure#client#clojure#nrepl#refresh#after'] = 'health-repl/restart'

And restart changed namespaces by default mapping <localleader>rr. See Conjure doc. It's very cool!

Технические хотелки

  • Вывод "нет пациентов", если в списке нет пациентов
  • Подумать про более изящное оформление селекторов в cljs
    • Оставить строками? Перенести на структуру данных?
  • Добавить обработку кейса с дублированием номера ОМС
  • Добавить отображение ошибок формы при создании/редактирования пациента (напр., сообщение о пользователе с таким номером ОМС)
  • Добавить пагинацию для списка пациентов
  • Заиспользовать clojure.spec?
    • Подумать про генерацию тестовых данных через spec
    • Подумать про замену библиотеки struct на clojure.spec
  • Добавить кеширование через Redis
  • Заменить подчёркивания на минусы в структуре пациента
  • Написать макрос для более удобного связывания типа [селектор-со-множеством-нод] (действие-для-каждой-ноды) в cljs
  • Подумать про рефакторинг роутинга
    • Сделать роут создания пациента как /patients/create? /patients-forms/create?
  • Подумать про функции для генерации роутов (url)
  • Почитать и сделать более удобный cljs workflow с приятным repl
  • Добавить деплой через k8s
  • Добавить аутентификацию/авторизацию
  • Добавить милые 404 / 500
  • Добавить linting в CI
  • Добавить отправку ошибок куда-нибудь (в Sentry, напр.)
  • Заиспользовать testcontainers для более продвинутого запуска тестов?
  • Написать фронтенда макрос "выполни функции, если валидация по схеме прошла успешно"
  • Изменить место конфигурации с переменных окружения на чтение файла .env
  • Добавить преобразование даты из БД в более гибкий объект (java.sql.Date -> LocalDate?)
  • Переписать фронтенд на re-frame / reagent / fulcro / etc
  • Добавить отдельный lein профиль для продакшн сборки cljs (с оптимизациями/сжатием)