aboutsummaryrefslogtreecommitdiff
path: root/interfaces
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2021-03-02 00:41:56 +0100
committerJohn Ankarström <john@ankarstrom.se>2021-03-02 00:41:56 +0100
commit8d21b802c35d5b1f8e6e868aaa20c1c0066275c9 (patch)
tree7bd3d732d6435d3aa826f1585a5b0a137526fa7f /interfaces
parent469a4c2424a684524a8323a8a1a3727e1b6a4ed7 (diff)
downloadcomb-8d21b802c35d5b1f8e6e868aaa20c1c0066275c9.tar.gz
Add new interfaces tree, remake database code as 'ruby' interface
This follows the directory structure outlined in my previous commit message.
Diffstat (limited to 'interfaces')
-rw-r--r--interfaces/http/http.rb10
-rw-r--r--interfaces/http/web/views/index.erb19
-rw-r--r--interfaces/http/web/web.rb6
-rw-r--r--interfaces/ruby/models/comment.rb20
-rw-r--r--interfaces/ruby/models/config.rb17
-rw-r--r--interfaces/ruby/models/post.rb18
-rw-r--r--interfaces/ruby/models/tag.rb26
-rw-r--r--interfaces/ruby/ruby.rb11
8 files changed, 127 insertions, 0 deletions
diff --git a/interfaces/http/http.rb b/interfaces/http/http.rb
new file mode 100644
index 0000000..0a8457c
--- /dev/null
+++ b/interfaces/http/http.rb
@@ -0,0 +1,10 @@
+require 'sinatra/base'
+require_relative '../ruby/ruby'
+require_relative 'web/web'
+
+$config = Config.first
+
+class HTTPInterface < Sinatra::Base
+ use WebInterface
+ run! if app_file == $0
+end
diff --git a/interfaces/http/web/views/index.erb b/interfaces/http/web/views/index.erb
new file mode 100644
index 0000000..80e64a5
--- /dev/null
+++ b/interfaces/http/web/views/index.erb
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <title><%= $config.title %></title>
+</head>
+<body>
+ <h1 id="title"><%= $config.title %></h1>
+ <% for post in @posts %>
+ <h2><%= post.title %></h2>
+ <div class="meta">
+ <p><%= post.created_at %></p>
+ </div>
+ <div class="content">
+ <%= post.body %>
+ </div>
+ <% end %>
+</body>
+</html>
diff --git a/interfaces/http/web/web.rb b/interfaces/http/web/web.rb
new file mode 100644
index 0000000..8ae8afd
--- /dev/null
+++ b/interfaces/http/web/web.rb
@@ -0,0 +1,6 @@
+class WebInterface < Sinatra::Base
+ get '/' do
+ @posts = Post.all
+ erb :index
+ end
+end \ No newline at end of file
diff --git a/interfaces/ruby/models/comment.rb b/interfaces/ruby/models/comment.rb
new file mode 100644
index 0000000..b3977f6
--- /dev/null
+++ b/interfaces/ruby/models/comment.rb
@@ -0,0 +1,20 @@
+class Comment < ActiveRecord::Base
+ belongs_to :post
+ validates_presence_of :date
+ validates_presence_of :author
+ validates_presence_of :email
+ validates_format_of :email, with: /@/
+ validates_presence_of :body
+end
+
+class CreateCommentTable < ActiveRecord::Migration[6.0]
+ def change
+ create_table :comments do |t|
+ t.references :post, foreign_key: true, index: true
+ t.string :author, null: false
+ t.string :email, null: false
+ t.string :body, null: false
+ t.timestamps
+ end
+ end
+end
diff --git a/interfaces/ruby/models/config.rb b/interfaces/ruby/models/config.rb
new file mode 100644
index 0000000..55b4106
--- /dev/null
+++ b/interfaces/ruby/models/config.rb
@@ -0,0 +1,17 @@
+class Config < ActiveRecord::Base
+ self.table_name = 'config'
+ validates_presence_of :title
+ validates_presence_of :timezone
+ validates_presence_of :postsperpage
+end
+
+class CreateConfigTable < ActiveRecord::Migration[6.0]
+ def change
+ create_table :config do |t|
+ t.string :title, null: false
+ t.string :subtitle
+ t.string :timezone, null: false
+ t.integer :postsperpage, null: false
+ end
+ end
+end
diff --git a/interfaces/ruby/models/post.rb b/interfaces/ruby/models/post.rb
new file mode 100644
index 0000000..1d44051
--- /dev/null
+++ b/interfaces/ruby/models/post.rb
@@ -0,0 +1,18 @@
+class Post < ActiveRecord::Base
+ has_many :comments
+ has_many :tags, through: :post_tag_links
+
+ validates_presence_of :title
+ validates_presence_of :body
+end
+
+class CreatePostTable < ActiveRecord::Migration[6.0]
+ def change
+ create_table :posts do |t|
+ t.string :title, null: false
+ t.string :body, null: false
+ t.boolean :locked, default: false
+ t.timestamps
+ end
+ end
+end
diff --git a/interfaces/ruby/models/tag.rb b/interfaces/ruby/models/tag.rb
new file mode 100644
index 0000000..9c24b6c
--- /dev/null
+++ b/interfaces/ruby/models/tag.rb
@@ -0,0 +1,26 @@
+class PostTagLink < ActiveRecord::Base
+ belongs_to :post
+ belongs_to :tag
+end
+
+class CreatePostTagLinkTable < ActiveRecord::Migration[6.0]
+ def change
+ create_table :post_tag_links do |t|
+ t.references :post, foreign_key: true, index: true
+ t.references :tag, foreign_key: true, index: true
+ end
+ end
+end
+
+class Tag < ActiveRecord::Base
+ belongs_to :post
+ validates_presence_of :name
+end
+
+class CreateTagTable < ActiveRecord::Migration[6.0]
+ def change
+ create_table :tags do |t|
+ t.string :name, null: false
+ end
+ end
+end
diff --git a/interfaces/ruby/ruby.rb b/interfaces/ruby/ruby.rb
new file mode 100644
index 0000000..4c18111
--- /dev/null
+++ b/interfaces/ruby/ruby.rb
@@ -0,0 +1,11 @@
+require 'active_record'
+
+ActiveRecord::Base.establish_connection(
+ adapter: 'sqlite3',
+ database: 'db.sqlite3'
+)
+
+require_relative 'models/config'
+require_relative 'models/comment'
+require_relative 'models/post'
+require_relative 'models/tag'