diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index fbd7f5a..994948d 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -23,6 +23,10 @@ jobs: with: go-version: "1.23" # adapte selon ta version + - name: Apply migrations + run: | + migrate -path=./migrations -database=$GREENLIGHT_DB_DSN up + - name: Build API run: | go mod tidy diff --git a/.gitignore b/.gitignore index 98bc964..1167180 100644 --- a/.gitignore +++ b/.gitignore @@ -124,6 +124,9 @@ fabric.properties .idea/**/markdown-navigator.xml .idea/**/markdown-navigator-enh.xml .idea/**/markdown-navigator/ +.idea/dataSources.xml +.idea/sqldialects.xml +.idea/sshConfigs.xml # Cache file creation bug # See https://youtrack.jetbrains.com/issue/JBR-2257 diff --git a/README.md b/README.md index 90f52d2..496f591 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,21 @@ There are two comon approaches to doing this : From an HTTP semantics point of view, using headers to convey the API version is the 'purer' approach. But from a user-experience point of view, using a URL prefix is arguably better. It makes it possible for developers to see which version of the API is being used at a glance, and it also means that the API can still be explored using a regular web browser (which is harder if custom headers are required). +## SQL Migrations + +The first thing we need to do is generate a pair of _migration files_ using the **migrate create** command : + +```bash +migrate create -seq -ext=.sql -dir=./migrations create_movies_table +``` + +In this command: + +- The **-seq** flag indicates that we want to use sequential numbering like **0001, 0002, ...** for the migration files (instead of a Unix timestamp, which is the default). +- The **-ext** flag indicates that we want to give the migration files the extension **.sql**. +- The **-dir** flag indicates that we want to store the migration files in the **./migrations** directory (which will be created automatically if it doesn't already exist). +- The name **create_movies_table** is a descriptive label that we give the migration files to signify their contents. + ## Additional Information ### How different Go Types are encoded diff --git a/cmd/api/main.go b/cmd/api/main.go index 8515038..f350ffb 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -19,7 +19,7 @@ Declare a string containing the application version number. Later we'll generate this automatically at build time, but for now we'll just store the version number as a hard-coded global constant. */ -const version = "1.0.0" +const version = "0.0.1" /* Define a config struct to hold all the configuration settings for our application. diff --git a/migrations/000001_create_movies_table.down.sql b/migrations/000001_create_movies_table.down.sql new file mode 100644 index 0000000..3983e77 --- /dev/null +++ b/migrations/000001_create_movies_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS movies; \ No newline at end of file diff --git a/migrations/000001_create_movies_table.up.sql b/migrations/000001_create_movies_table.up.sql new file mode 100644 index 0000000..8fdf100 --- /dev/null +++ b/migrations/000001_create_movies_table.up.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS movies ( + id bigserial PRIMARY KEY, + created_at timestamp(0) with time zone NOT NULL DEFAULT NOW(), + title text NOT NULL, + year integer NOT NULL, + runtime integer NOT NULL, + genres text[] NOT NULL, + version integer NOT NULL DEFAULT 1 +); \ No newline at end of file diff --git a/migrations/000002_add_movies_check_constraints.down.sql b/migrations/000002_add_movies_check_constraints.down.sql new file mode 100644 index 0000000..1f9a7c3 --- /dev/null +++ b/migrations/000002_add_movies_check_constraints.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE movies DROP CONSTRAINT IF EXISTS movies_runtime_check; +ALTER TABLE movies DROP CONSTRAINT IF EXISTS movies_year_check; +ALTER TABLE movies DROP CONSTRAINT IF EXISTS genres_length_check; \ No newline at end of file diff --git a/migrations/000002_add_movies_check_constraints.up.sql b/migrations/000002_add_movies_check_constraints.up.sql new file mode 100644 index 0000000..dd5834f --- /dev/null +++ b/migrations/000002_add_movies_check_constraints.up.sql @@ -0,0 +1,5 @@ +ALTER TABLE movies ADD CONSTRAINT movies_runtime_check CHECK (runtime >= 0); + +ALTER TABLE movies ADD CONSTRAINT movies_year_check CHECK (year BETWEEN 1888 AND date_part('year', now())); + +ALTER TABLE movies ADD CONSTRAINT genres_length_check CHECK (array_length(genres, 1) BETWEEN 1 AND 5); \ No newline at end of file