diff --git a/Gemfile b/Gemfile index f745dac..5850f47 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,9 @@ group :development do gem "dotenv" end +# Tasks +gem "rake" + # Base gem "roda" gem "rackup" diff --git a/Gemfile.lock b/Gemfile.lock index 2e1c5fb..c4583e4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -41,6 +41,7 @@ GEM rack (3.2.7) rackup (2.3.1) rack (>= 3) + rake (13.4.2) rbs (4.2.0) logger prism (>= 1.6.0) @@ -68,7 +69,7 @@ PLATFORMS x86_64-linux DEPENDENCIES - bcrypt (~> 3.1) + bcrypt commonmarker dotenv erubi @@ -76,8 +77,9 @@ DEPENDENCIES mail puma rackup + rake roda - rodauth (~> 2.49) + rodauth sequel sqlite3 tilt @@ -106,6 +108,7 @@ CHECKSUMS puma (8.0.2) sha256=c8ed871dfbbe66448ea9ffd46692342d9804d4071522b52b5331b7b6e7b686fb rack (3.2.7) sha256=93e13e1c24f93556671d85d2d79fa228c3485815c50d7e2f265b5330c6528fb7 rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868 + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 rbs (4.2.0) sha256=51f7b886dcc05bc09e10b901daa6a81829f6adc03101d6ca9ea4aac6103e0674 rdoc (8.1.0) sha256=befc37880a5cfd36dcb176c748b5fd5ee39dd3536a75e81824e4972ce230f60a reline (0.7.0) sha256=5b012d8e55dbf9d450f12bde2cf7d15ff546ae80b3f8f3b30e570d431815583d diff --git a/README.md b/README.md index 903d9ab..011e5bb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # netig.net -## TODO +## À faire -- ajouter une limite pour éviter les spams (/contact/send) +- limiter le spam sur `/contact/send` - développer les comptes utilisateurs et leur interface -- ajouter l'affichage des recettes/dépenses sur la page d'accueil +- afficher les recettes et dépenses sur la page d'accueil ## Développement @@ -21,7 +21,20 @@ SESSION_SECRET=... SMTP_PASSWORD=... ``` -Générer `SESSION_SECRET` avec `openssl rand -hex 64` et conserver la valeur dans `.env`. +Générer `SESSION_SECRET` avec `openssl rand -hex 64`. +Ne pas versionner le fichier `.env`. + +Appliquer les migrations : + +```sh +bundle exec rake db:migrate +``` + +Lister les tâches disponibles : + +```sh +bundle exec rake -T +``` Démarrer le serveur de développement : @@ -37,4 +50,12 @@ bundle exec irb -r dotenv/load -r ./netig.rb ## Production -Docker Compose fournit les variables avec `env_file` et définit `RACK_ENV=production`. +Docker Compose fournit les variables d'environnement via `env_file` +et définit `RACK_ENV=production`. + +Exécuter les migrations dans le conteneur applicatif avant de +démarrer la nouvelle version : + +```sh +bundle exec rake db:migrate +``` diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..7ac2bfe --- /dev/null +++ b/Rakefile @@ -0,0 +1,25 @@ +require "dotenv/load" if ENV.fetch("RACK_ENV", "development") == "development" + +require_relative "lib/database" + +Sequel.extension :migration + +MIGRATIONS_PATH = File.expand_path("db/migrations", __dir__) + +namespace :db do + desc "Apply pending database migrations" + task :migrate do + Sequel::Migrator.run(DB, MIGRATIONS_PATH) + end + + desc "Display current migration version" + task :version do + version = if DB.tables.include?(:schema_info) + DB[:schema_info].get(:version) || 0 + else + 0 + end + + puts "Schema version: #{version}" + end +end diff --git a/db/migrations/002_create_members.rb b/db/migrations/002_create_members.rb new file mode 100644 index 0000000..77a27c8 --- /dev/null +++ b/db/migrations/002_create_members.rb @@ -0,0 +1,35 @@ +Sequel.migration do + up do + create_table(:members) do + primary_key :id, type: :Bignum + + foreign_key :account_id, :accounts, + type: :Bignum, + null: false + + String :kind, null: false + String :first_name + String :last_name + String :organization_name + + index :account_id, unique: true + + constraint :members_kind_valid, + Sequel.lit("kind IN ('individual', 'organization')") + + constraint :members_identity_matches_kind, + Sequel.lit( + "(kind = 'individual' AND first_name IS NOT NULL " \ + "AND trim(first_name) <> '' AND last_name IS NOT NULL " \ + "AND trim(last_name) <> '' AND organization_name IS NULL) " \ + "OR (kind = 'organization' AND first_name IS NULL " \ + "AND last_name IS NULL AND organization_name IS NOT NULL " \ + "AND trim(organization_name) <> '')" + ) + end + end + + down do + drop_table(:members) + end +end