Add database schema and migration tasks
This commit is contained in:
1 parent
7a4805f749
commit
cde8e13705
5 files changed
+94
-7
No files matched your search
@@ -8,6 +8,9 @@ group :development do
|
||||
gem "dotenv"
|
||||
end
|
||||
|
||||
# Tasks
|
||||
gem "rake"
|
||||
|
||||
# Base
|
||||
gem "roda"
|
||||
gem "rackup"
|
||||
|
||||
+5
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in new issue
Block a user