3 コミット

作成者 SHA1 メッセージ 日付
  Dylan Baker 903a329ffb Link directly to post 3年前
  Dylan Baker 7db28d294b Truncate post body in results 3年前
  Dylan Baker a4601594ea Allow running old migratinos 3年前
5個のファイルの変更66行の追加37行の削除
  1. 2
    0
      Gemfile
  2. 5
    0
      Gemfile.lock
  3. 52
    35
      db/migrate.rb
  4. 5
    0
      web/server.rb
  5. 2
    2
      web/views/results.erb

+ 2
- 0
Gemfile ファイルの表示

@@ -13,3 +13,5 @@ gem 'rspec', '~> 3.9'
13 13
 gem 'sassc', '~> 2.2'
14 14
 gem 'sequel', '~> 5.30'
15 15
 gem 'sinatra', '~> 2.0'
16
+
17
+gem "truncato", "~> 0.7.11"

+ 5
- 0
Gemfile.lock ファイルの表示

@@ -4,6 +4,7 @@ GEM
4 4
     diff-lcs (1.3)
5 5
     dotenv (2.7.5)
6 6
     ffi (1.12.2)
7
+    htmlentities (4.3.4)
7 8
     httparty (0.18.0)
8 9
       mime-types (~> 3.0)
9 10
       multi_xml (>= 0.5.2)
@@ -44,6 +45,9 @@ GEM
44 45
       rack-protection (= 2.0.8.1)
45 46
       tilt (~> 2.0)
46 47
     tilt (2.0.10)
48
+    truncato (0.7.11)
49
+      htmlentities (~> 4.3.1)
50
+      nokogiri (>= 1.7.0, <= 2.0)
47 51
 
48 52
 PLATFORMS
49 53
   ruby
@@ -59,6 +63,7 @@ DEPENDENCIES
59 63
   sassc (~> 2.2)
60 64
   sequel (~> 5.30)
61 65
   sinatra (~> 2.0)
66
+  truncato (~> 0.7.11)
62 67
 
63 68
 BUNDLED WITH
64 69
    2.1.4

+ 52
- 35
db/migrate.rb ファイルの表示

@@ -1,9 +1,10 @@
1
+require 'pg'
1 2
 require 'sequel'
2 3
 
3 4
 require_relative 'connect'
4 5
 
5 6
 def migrate
6
-  db = connect
7
+  db = DB
7 8
   db.create_table? :threads do
8 9
     primary_key :id
9 10
     String :title
@@ -24,38 +25,54 @@ def migrate
24 25
     column :tsv, 'tsvector'
25 26
   end
26 27
 
27
-  db.run('CREATE INDEX tsv_idx ON posts USING gin(tsv);')
28
-
29
-  db.create_function?(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
30
-    BEGIN
31
-      UPDATE threads
32
-      SET
33
-        last_post_created_at = NEW.created_at,
34
-        last_post_creator = NEW.creator
35
-      WHERE
36
-        threads.id = NEW.thread_id;
37
-      RETURN NEW;
38
-    END
39
-  SQL
40
-
41
-  db.create_function?(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
42
-    BEGIN
43
-      NEW.tsv = to_tsvector(new.body);
44
-      RETURN NEW;
45
-    END
46
-  SQL
47
-
48
-  db.run(<<-SQL)
49
-    CREATE TRIGGER update_last_post
50
-    AFTER INSERT ON posts
51
-    FOR EACH ROW
52
-    EXECUTE PROCEDURE update_last_post();
53
-  SQL
54
-
55
-  db.run(<<-SQL)
56
-    CREATE TRIGGER set_posts_tsv
57
-    BEFORE INSERT OR UPDATE ON posts
58
-    FOR EACH ROW
59
-    EXECUTE PROCEDURE set_posts_tsv();
60
-  SQL
28
+  db.run('CREATE INDEX IF NOT EXISTS tsv_idx ON posts USING gin(tsv);')
29
+
30
+  begin
31
+    db.create_function(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
32
+      BEGIN
33
+        UPDATE threads
34
+        SET
35
+          last_post_created_at = NEW.created_at,
36
+          last_post_creator = NEW.creator
37
+        WHERE
38
+          threads.id = NEW.thread_id;
39
+        RETURN NEW;
40
+      END
41
+    SQL
42
+  rescue Sequel::DatabaseError => e
43
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
44
+  end
45
+
46
+  begin
47
+    db.create_function(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
48
+      BEGIN
49
+        NEW.tsv = to_tsvector(new.body);
50
+        RETURN NEW;
51
+      END
52
+    SQL
53
+  rescue Sequel::DatabaseError => e
54
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
55
+  end
56
+
57
+  begin
58
+    db.run(<<-SQL)
59
+      CREATE TRIGGER update_last_post
60
+      AFTER INSERT ON posts
61
+      FOR EACH ROW
62
+      EXECUTE PROCEDURE update_last_post();
63
+    SQL
64
+  rescue Sequel::DatabaseError => e
65
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
66
+  end
67
+
68
+  begin
69
+    db.run(<<-SQL)
70
+      CREATE TRIGGER set_posts_tsv
71
+      BEFORE INSERT OR UPDATE ON posts
72
+      FOR EACH ROW
73
+      EXECUTE PROCEDURE set_posts_tsv();
74
+    SQL
75
+  rescue Sequel::DatabaseError => e
76
+    raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
77
+  end
61 78
 end

+ 5
- 0
web/server.rb ファイルの表示

@@ -1,6 +1,7 @@
1 1
 require 'dotenv/load'
2 2
 require 'sequel'
3 3
 require 'sinatra'
4
+require 'truncato'
4 5
 
5 6
 require_relative '../db/connect'
6 7
 require_relative '../lib/auth'
@@ -122,6 +123,10 @@ class VLVSearch < Sinatra::Base
122 123
     def external_link(url, text)
123 124
       "<a href=\"#{url}\" target=\"_blank\">#{text}</a>"
124 125
     end
126
+
127
+    def truncate(s)
128
+      Truncato.truncate(s, max_length: 500)
129
+    end
125 130
   end
126 131
 
127 132
   run! if __FILE__ == $0

+ 2
- 2
web/views/results.erb ファイルの表示

@@ -32,7 +32,7 @@
32 32
               In thread:
33 33
               <strong>
34 34
                 <%= external_link(
35
-                  "http://board.vivalavinyl.com/thread/view/#{result[:remote_thread_id]}",
35
+                  "http://board.vivalavinyl.com/thread/view/#{result[:remote_thread_id]}#post_#{result[:remote_id]}",
36 36
                   result[:thread_title]
37 37
                 ) %>
38 38
               </strong>
@@ -41,7 +41,7 @@
41 41
               <%= result[:creator] %> posted this at <%= result[:created_at] %>
42 42
             </p>
43 43
             <p class="result__body">
44
-              <%= result[:body] %>
44
+              <%= truncate(result[:body]) %>
45 45
             </p>
46 46
           <% end %>
47 47
         </div>

読み込み中…
キャンセル
保存