aboutsummaryrefslogtreecommitdiff
path: root/src/guff/migrations.cr
blob: aef1f27b896fe0aff0a26e73fe4581aea64db7db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
require "./database"

module Guff
  MIGRATIONS = [{
    id: "0-null",
    sql: %w{},
  }, {
    id: "1-create-tags-and-posts",

    sql: [%{
      CREATE TABLE metadata (
        name    TEXT PRIMARY KEY,
        value   TEXT NOT NULL
      )
    }, %{
      CREATE TABLE sites (
        -- site id
        site_id     INTEGER PRIMARY KEY,

        -- name of site
        name        TEXT UNIQUE NOT NULL
                    CHECK (LENGTH(name) > 0),

        -- is this the default site?
        is_default  BOOLEAN NOT NULL DEFAULT false
      )
    }, %{
      INSERT INTO sites(name, is_default) VALUES ('Default', 1)
    }, %{
      CREATE TABLE posts (
        -- unique id
        post_id     INTEGER PRIMARY KEY,

        site_id     INTEGER NOT NULL
                    REFERENCES sites(site_id),

        -- false if this post has been deleted
        is_active   BOOLEAN NOT NULL
                    DEFAULT true,

        -- when this post was created
        created_at  TIMESTAMP WITH TIME ZONE
                    NOT NULL DEFAULT CURRENT_TIMESTAMP,

        -- when this post was posted
        -- (that is, the draft status was removed)
        posted_at   TIMESTAMP WITH TIME ZONE
                    NOT NULL DEFAULT CURRENT_TIMESTAMP,

        -- title of post
        name        TEXT NOT NULL
                    CHECK (LENGTH(name) > 0),

        -- slug of post (url fragment)
        slug        TEXT NOT NULL
                    CHECK (LENGTH(slug) > 0),

        -- body (raw text before filters)
        body        TEXT NOT NULL
                    CHECK (LENGTH(body) > 0),

        -- generated html (after filters)
        html        TEXT NOT NULL
                    CHECK (LENGTH(html) > 0)
      )
    }, %{
      CREATE INDEX in_posts_slug ON posts(slug)
    }],
  }, {
    id: "2-create-tags",

    sql: [%{
      CREATE TABLE tags (
        tag_id      INTEGER PRIMARY KEY,
        name        TEXT UNIQUE NOT NULL
      )
    }, %{
      CREATE INDEX in_tags_name ON tags(name)
    }, %{
      CREATE TABLE post_tags (
        tag_id      INTEGER NOT NULL 
                    REFERENCES tags(tag_id),

        post_id     INTEGER NOT NULL 
                    REFERENCES posts(post_id),

        UNIQUE(tag_id, post_id)
      )
    }, %{
      CREATE INDEX in_post_tags_tag_id ON post_tags(tag_id)
    }, %{
      CREATE INDEX in_post_tags_post_id ON post_tags(post_id)
    }],
  }, {
    id: "3-create-domains",

    sql: [%{
      CREATE TABLE domains (
        -- domain
        domain      TEXT PRIMARY KEY CHECK (
                      LENGTH(domain) > 0 AND
                      domain = LOWER(domain)
                    ),

        -- site id
        site_id     INTEGER NOT NULL
                    REFERENCES sites(site_id)
      )
    }],
  }]
end