notee 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/notee/application.js +45 -76973
- data/app/controllers/notee/comments_controller.rb +1 -1
- data/app/controllers/notee/tokens_controller.rb +15 -0
- data/app/models/notee/post.rb +1 -1
- data/app/models/notee/user.rb +0 -6
- data/app/views/notee/partials/_comment_box.html.erb +109 -120
- data/app/views/notee/partials/_meta.html.erb +3 -1
- data/app/views/notee/tokens/new.html.erb +16 -4
- data/config/routes.rb +2 -16
- data/db/migrate/20160605141437_create_notee_posts.rb +56 -1
- data/db/migrate/20160809145754_create_notee_users.rb +5 -0
- data/lib/notee/helpers/notee_helper.rb +8 -4
- data/lib/notee/version.rb +1 -1
- data/lib/tasks/config/notee.rb +1 -1
- data/lib/tasks/controllers/errors_controller.rb +23 -0
- data/lib/tasks/controllers/notee_controller.rb +1 -0
- data/lib/tasks/notee_tasks.rake +86 -48
- data/lib/tasks/stylesheets/notee/social/social.css +1 -0
- data/lib/tasks/views/layouts/notee_application.html.erb +6 -0
- data/lib/tasks/views/notee/about.html.erb +36 -41
- data/lib/tasks/views/notee/archives.html.erb +9 -14
- data/lib/tasks/views/notee/categories.html.erb +9 -14
- data/lib/tasks/views/notee/errors/internal_server_error.html.erb +5 -0
- data/lib/tasks/views/notee/errors/not_found.html.erb +5 -0
- data/lib/tasks/views/notee/partials/_footer.html.erb +5 -3
- data/lib/tasks/views/notee/partials/_header.html.erb +11 -1
- data/lib/tasks/views/notee/posts.html.erb +41 -44
- data/lib/tasks/views/notee/show.html.erb +29 -34
- data/lib/tasks/views/notee/writers.html.erb +5 -10
- data/test/controllers/notee/categories_controller_test.rb +2 -2
- data/test/controllers/notee/comments_controller_test.rb +2 -2
- data/test/controllers/notee/images_controller_test.rb +2 -2
- data/test/controllers/notee/posts_controller_test.rb +2 -2
- metadata +6 -2
@@ -1,6 +1,10 @@
|
|
1
1
|
|
2
2
|
require_dependency 'notee/application_controller'
|
3
3
|
|
4
|
+
require 'open-uri'
|
5
|
+
require 'json'
|
6
|
+
require 'uri'
|
7
|
+
|
4
8
|
module Notee
|
5
9
|
class TokensController < ApplicationController
|
6
10
|
skip_before_filter :restrict_access_json, only: [:new, :create]
|
@@ -9,6 +13,7 @@ module Notee
|
|
9
13
|
end
|
10
14
|
|
11
15
|
def create
|
16
|
+
check_recaptcha
|
12
17
|
User.sign_in(params[:id], params[:password])
|
13
18
|
redirect_to root_path
|
14
19
|
end
|
@@ -23,5 +28,15 @@ module Notee
|
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
31
|
+
|
32
|
+
def check_recaptcha
|
33
|
+
endpoint = 'https://www.google.com/recaptcha/api/siteverify?secret=' + Notee.recaptcha_secret_key + '&response=' + params["g-recaptcha-response"]
|
34
|
+
uri = URI.parse(endpoint)
|
35
|
+
json = Net::HTTP.get(uri)
|
36
|
+
result = JSON.parse(json)
|
37
|
+
if result["success"] == false
|
38
|
+
raise
|
39
|
+
end
|
40
|
+
end
|
26
41
|
end
|
27
42
|
end
|
data/app/models/notee/post.rb
CHANGED
data/app/models/notee/user.rb
CHANGED
@@ -67,12 +67,6 @@ module Notee
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def self.root_user_setting
|
70
|
-
unless User.exists?(id: 0)
|
71
|
-
User.skip_callback(:create, :before, :create_authority)
|
72
|
-
User.create(id: 0, name: Notee.notee_id, email: "root", password: SecureRandom.hex, role: 9999)
|
73
|
-
User.set_callback(:create, :before, :create_authority)
|
74
|
-
end
|
75
|
-
|
76
70
|
if token = Token.create!(user_id: 0)
|
77
71
|
Thread.current[:request].session[:access_token] = token.access_token
|
78
72
|
end
|
@@ -1,137 +1,126 @@
|
|
1
|
+
|
2
|
+
<!-- Riot.js Settings -->
|
3
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.3.18/riot+compiler.js"></script>
|
4
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/superagent/2.1.0/superagent.min.js"></script>
|
5
|
+
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
6
|
+
|
7
|
+
|
1
8
|
<div class="notee_list">
|
2
9
|
<comments post_id='<%= post_id %>'></comments>
|
10
|
+
<div data-callback="syncerRecaptchaCallback" class="g-recaptcha notee_comment_form" data-sitekey="<%= recaptcha %>"></div>
|
3
11
|
<comment_form post_id='<%= post_id %>'></comment_form>
|
4
12
|
</div>
|
5
13
|
|
6
|
-
<!-- <comment> tag -->
|
7
14
|
|
8
15
|
<script type="riot/tag">
|
9
|
-
|
10
|
-
var obs = riot.observable();
|
11
|
-
|
12
|
-
/////////////////////////////////////////
|
13
|
-
// comment_form tag
|
14
|
-
/////////////////////////////////////////
|
15
|
-
|
16
|
-
<comment_form class="notee_comment_form" id="notee_form">
|
17
|
-
<form method="POST">
|
18
|
-
|
19
|
-
<label class="notee_label" for="comment_name">Name</label>
|
20
|
-
<input class="notee_text_field" type="text" name="comment[name]" id="comment_name" />
|
21
|
-
|
22
|
-
<label class="notee_label" for="comment_email">Email</label>
|
23
|
-
<input class="notee_text_field" type="text" name="comment[email]" id="comment_email" />
|
24
|
-
|
25
|
-
<label class="notee_label" for="comment_content">Content</label>
|
26
|
-
<textarea class="notee_text_area" name="comment[content]" id="comment_content"></textarea>
|
27
|
-
|
28
|
-
<div class="g-recaptcha" data-sitekey="<%= recaptcha %>"></div>
|
29
|
-
|
30
|
-
<input
|
31
|
-
type="submit"
|
32
|
-
value="Create Comment"
|
33
|
-
class="notee_submit"
|
34
|
-
data-disable-with="Create Comment"
|
35
|
-
onClick={notee_submit} />
|
36
|
-
|
37
|
-
</form>
|
38
|
-
|
39
|
-
this.notee_submit = function(e){
|
40
|
-
e.preventDefault();
|
41
|
-
var comment = {
|
42
|
-
post_id: opts.post_id,
|
43
|
-
name: document.getElementById("comment_name").value,
|
44
|
-
email: document.getElementById("comment_email").value,
|
45
|
-
content: document.getElementById("comment_content").value
|
46
|
-
};
|
47
|
-
|
48
|
-
if(comment.content != null || comment.content != ""){
|
49
|
-
var request = window.superagent;
|
50
|
-
var url = "/notee/api/comments";
|
51
|
-
var self = this;
|
52
|
-
|
53
|
-
request
|
54
|
-
.post(url)
|
55
|
-
.send({ comment: comment })
|
56
|
-
.end(function(err, res){
|
57
|
-
if(res.status == 200){
|
58
|
-
obs.trigger("notee_submit");
|
59
|
-
document.getElementById("comment_name").value = "";
|
60
|
-
document.getElementById("comment_email").value = "";
|
61
|
-
document.getElementById("comment_content").value = "";
|
62
|
-
}
|
63
|
-
});
|
64
|
-
}
|
65
|
-
}
|
66
|
-
|
67
|
-
</comment_form>
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
/////////////////////////////////////////
|
72
|
-
// comment tag
|
73
|
-
/////////////////////////////////////////
|
74
|
-
|
75
16
|
|
76
|
-
|
77
|
-
<p class="notee_comment_name">{ name }</p>
|
78
|
-
<p class="notee_comment_content"> { content } </p>
|
17
|
+
var obs = riot.observable();
|
79
18
|
|
80
|
-
|
81
|
-
|
82
|
-
|
19
|
+
<comment_form class="notee_comment_form" id="notee_form">
|
20
|
+
<form method="POST" id="syncer-recaptcha-form">
|
21
|
+
<label class="notee_label" for="comment_name">Name</label>
|
22
|
+
<input class="notee_text_field" type="text" name="comment[name]" id="comment_name" disabled />
|
83
23
|
|
24
|
+
<label class="notee_label" for="comment_email">Email</label>
|
25
|
+
<input class="notee_text_field" type="text" name="comment[email]" id="comment_email" disabled />
|
84
26
|
|
27
|
+
<label class="notee_label" for="comment_content">Content</label>
|
28
|
+
<textarea class="notee_text_area" name="comment[content]" id="comment_content" disabled></textarea>
|
85
29
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
name={item.name}
|
95
|
-
content={item.content}>
|
96
|
-
</comment>
|
97
|
-
|
98
|
-
var request = window.superagent;
|
99
|
-
var url = "/notee/api/comments/" + opts.post_id
|
100
|
-
var self = this;
|
101
|
-
|
102
|
-
this.one('update', function() {
|
103
|
-
request
|
104
|
-
.get(url)
|
105
|
-
.end(function(err, res){
|
106
|
-
console.log(res.body.comments);
|
107
|
-
self.items = res.body.comments;
|
108
|
-
self.update();
|
109
|
-
});
|
110
|
-
})
|
111
|
-
|
112
|
-
obs.on("notee_submit", function() {
|
113
|
-
request
|
114
|
-
.get(url)
|
115
|
-
.end(function(err, res){
|
116
|
-
console.log(res.body.comments);
|
117
|
-
self.items = res.body.comments;
|
118
|
-
self.update();
|
119
|
-
});
|
120
|
-
});
|
30
|
+
<input
|
31
|
+
type="submit"
|
32
|
+
value="Create Comment"
|
33
|
+
class="notee_submit"
|
34
|
+
data-disable-with="Create Comment"
|
35
|
+
onClick={notee_submit}
|
36
|
+
disabled />
|
37
|
+
</form>
|
121
38
|
|
122
|
-
|
39
|
+
this.notee_submit = function(e){
|
40
|
+
e.preventDefault();
|
41
|
+
var comment = {
|
42
|
+
post_id: opts.post_id,
|
43
|
+
name: document.getElementById("comment_name").value,
|
44
|
+
email: document.getElementById("comment_email").value,
|
45
|
+
content: document.getElementById("comment_content").value
|
46
|
+
};
|
47
|
+
|
48
|
+
if(comment.content != null || comment.content != ""){
|
49
|
+
var request = window.superagent;
|
50
|
+
var url = "/notee/api/comments";
|
51
|
+
var self = this;
|
52
|
+
|
53
|
+
request
|
54
|
+
.post(url)
|
55
|
+
.send({ comment: comment })
|
56
|
+
.end(function(err, res){
|
57
|
+
if(res.status == 200){
|
58
|
+
obs.trigger("notee_submit");
|
59
|
+
document.getElementById("comment_name").value = "";
|
60
|
+
document.getElementById("comment_email").value = "";
|
61
|
+
document.getElementById("comment_content").value = "";
|
62
|
+
}
|
63
|
+
});
|
64
|
+
}
|
65
|
+
}
|
66
|
+
</comment_form>
|
67
|
+
|
68
|
+
<comment class="notee_comment">
|
69
|
+
<p class="notee_comment_name">{ name }</p>
|
70
|
+
<p class="notee_comment_content"> { content } </p>
|
71
|
+
|
72
|
+
this.name = opts.name;
|
73
|
+
this.content = opts.content;
|
74
|
+
</comment>
|
75
|
+
|
76
|
+
<comments class="notee_comments">
|
77
|
+
<comment
|
78
|
+
each={ item in items }
|
79
|
+
name={item.name}
|
80
|
+
content={item.content}>
|
81
|
+
</comment>
|
82
|
+
|
83
|
+
var request = window.superagent;
|
84
|
+
var url = "/notee/api/comments/" + opts.post_id;
|
85
|
+
var self = this;
|
86
|
+
|
87
|
+
this.one('update', function() {
|
88
|
+
request
|
89
|
+
.get(url)
|
90
|
+
.end(function(err, res){
|
91
|
+
if(res.body != null){
|
92
|
+
self.items = res.body.comments;
|
93
|
+
self.update();
|
94
|
+
}
|
95
|
+
});
|
96
|
+
})
|
97
|
+
|
98
|
+
obs.on("notee_submit", function() {
|
99
|
+
request
|
100
|
+
.get(url)
|
101
|
+
.end(function(err, res){
|
102
|
+
self.items = res.body.comments;
|
103
|
+
self.update();
|
104
|
+
});
|
105
|
+
});
|
106
|
+
</comments>
|
123
107
|
</script>
|
124
108
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
<!-- Riot.js Settings -->
|
129
|
-
|
130
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.3.18/riot+compiler.js"></script>
|
131
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/superagent/2.1.0/superagent.min.js"></script>
|
132
|
-
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
133
109
|
<script>
|
134
|
-
|
135
|
-
|
136
|
-
|
110
|
+
if(window.addEventListener) {
|
111
|
+
window.addEventListener( "load" , riot_mount, false );
|
112
|
+
}else{
|
113
|
+
window.attachEvent( "onload", riot_mount );
|
114
|
+
}
|
115
|
+
|
116
|
+
function riot_mount(){
|
117
|
+
riot.mount('*');
|
118
|
+
}
|
119
|
+
|
120
|
+
function syncerRecaptchaCallback( code ){
|
121
|
+
if(code != ""){
|
122
|
+
$( '#syncer-recaptcha-form input , #syncer-recaptcha-form button, #syncer-recaptcha-form textarea' ).removeAttr( 'disabled' ) ;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
137
126
|
</script>
|
@@ -1,6 +1,8 @@
|
|
1
1
|
|
2
2
|
<!-- Notee Meta Info -->
|
3
3
|
|
4
|
+
<% meta ||= Notee.blog_meta %>
|
5
|
+
|
4
6
|
<title><%= meta[:title] %></title>
|
5
7
|
<meta name="keywords" content="<%= meta[:keyword] %>"/>
|
6
8
|
<meta name="description" content="<%= meta[:description] %>"/>
|
@@ -22,4 +24,4 @@
|
|
22
24
|
ga('create', '<%= ga %>', 'auto');
|
23
25
|
ga('send', 'pageview');
|
24
26
|
|
25
|
-
</script>
|
27
|
+
</script>
|
@@ -1,13 +1,25 @@
|
|
1
|
+
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
2
|
+
|
1
3
|
<div class="grid_start login_bg">
|
2
4
|
<div class="fourty grid offset_by_twenty_five mt_60 login">
|
3
5
|
<h1>Notee</h1>
|
4
6
|
<p>Notee is creating blog gem by only one command</p>
|
5
|
-
<%= form_tag(tokens_path, :class => 'mt_50') do %>
|
7
|
+
<%= form_tag(tokens_path, :class => 'mt_50', :id => 'syncer-recaptcha-form') do %>
|
6
8
|
<h3>ID:</h3>
|
7
|
-
<%= text_field_tag :id %>
|
9
|
+
<%= text_field_tag :id, "", :disabled => true %>
|
8
10
|
<h3>PASSWORD:</h3>
|
9
|
-
<%= password_field_tag :password %>
|
10
|
-
|
11
|
+
<%= password_field_tag :password, "", :disabled => true %>
|
12
|
+
<div data-callback="syncerRecaptchaCallback" class="g-recaptcha mt_30" data-sitekey="<%= Notee.recaptcha_key %>"></div>
|
13
|
+
<%= submit_tag "ログイン", :disabled => true, :class => 'full grid mt_50' %>
|
11
14
|
<% end %>
|
12
15
|
</div>
|
13
16
|
</div>
|
17
|
+
|
18
|
+
<script>
|
19
|
+
function syncerRecaptchaCallback( code ){
|
20
|
+
if(code != ""){
|
21
|
+
$( '#syncer-recaptcha-form input , #syncer-recaptcha-form button, #syncer-recaptcha-form textarea' ).removeAttr( 'disabled' ) ;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
</script>
|
25
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
data/config/routes.rb
CHANGED
@@ -2,22 +2,6 @@ Notee::Engine.routes.draw do
|
|
2
2
|
|
3
3
|
root to: 'notees#index'
|
4
4
|
|
5
|
-
get 'posts' => 'notees#index'
|
6
|
-
get 'posts/new' => 'notees#index'
|
7
|
-
get 'posts/edit/:id' => 'notees#index'
|
8
|
-
get 'categories' => 'notees#index'
|
9
|
-
get 'categories/edit/:id' => 'notees#index'
|
10
|
-
get 'images' => 'notees#index'
|
11
|
-
get 'comments' => 'notees#index'
|
12
|
-
get 'users' => 'notees#index'
|
13
|
-
get 'users/new' => 'notees#index'
|
14
|
-
get 'users/edit/:id' => 'notees#index'
|
15
|
-
get 'trashes' => 'notees#index'
|
16
|
-
get 'trashes/:model' => 'notees#index'
|
17
|
-
get 'mypage' => 'notees#index'
|
18
|
-
get 'mypage/edit' => 'notees#index'
|
19
|
-
get 'mypage/edit/password' => 'notees#index'
|
20
|
-
|
21
5
|
# post 'secret_published' => 'notees#secret_published'
|
22
6
|
resources :tokens, only: [:new, :create, :destroy]
|
23
7
|
|
@@ -33,4 +17,6 @@ Notee::Engine.routes.draw do
|
|
33
17
|
resources :roles, only: [:index, :show]
|
34
18
|
resources :trashes, only: [:index, :update]
|
35
19
|
end
|
20
|
+
|
21
|
+
get '*anything' => 'notees#index'
|
36
22
|
end
|
@@ -1,4 +1,55 @@
|
|
1
1
|
# This migration comes from notee (originally 20160605141437)
|
2
|
+
|
3
|
+
INITIAL_TXT = <<-EOC
|
4
|
+
|
5
|
+
# Notee
|
6
|
+
|
7
|
+
Notee is creating CMS(blog) app by only one command.
|
8
|
+
|
9
|
+
BackEnd: Ruby(RailsEngine)
|
10
|
+
FrontEnd: React.js + Riot.js(only comment part)
|
11
|
+
|
12
|
+
## Setting
|
13
|
+
|
14
|
+
update for your setting in config/initializers/notee.rb
|
15
|
+
|
16
|
+
Recommendation using .env
|
17
|
+
|
18
|
+
```rb
|
19
|
+
require 'notee'
|
20
|
+
|
21
|
+
# Recommendation using .env for manage id & password
|
22
|
+
|
23
|
+
Notee.configure do |config|
|
24
|
+
|
25
|
+
# root-user
|
26
|
+
config.notee_id = "your_name"
|
27
|
+
config.notee_password = "your_password"
|
28
|
+
|
29
|
+
# recaptcha
|
30
|
+
config.recaptcha_key = "hogehoge"
|
31
|
+
config.recaptcha_secret_key = "hogehoge"
|
32
|
+
|
33
|
+
# blog
|
34
|
+
config.blog_meta = {
|
35
|
+
title: "Notee",
|
36
|
+
url: "http://hogehoge.com",
|
37
|
+
keyword: "hoge, hoge, hoge",
|
38
|
+
description: "【react&rails】notee is creating CMS(blog) app by only one command.",
|
39
|
+
og_image: "http://hogehoge.com/hoge.png"
|
40
|
+
}
|
41
|
+
|
42
|
+
# google-analytics
|
43
|
+
config.google_analytics = "hogehogehogehoge"
|
44
|
+
end
|
45
|
+
|
46
|
+
```
|
47
|
+
|
48
|
+
## Helper Method
|
49
|
+
[Helper Method](https://github.com/funaota/notee/wiki/Helper-Method)
|
50
|
+
|
51
|
+
EOC
|
52
|
+
|
2
53
|
class CreateNoteePosts < ActiveRecord::Migration
|
3
54
|
def change
|
4
55
|
create_table :notee_posts do |t|
|
@@ -23,9 +74,13 @@ class CreateNoteePosts < ActiveRecord::Migration
|
|
23
74
|
|
24
75
|
|
25
76
|
t.timestamps null: false
|
26
|
-
|
27
77
|
end
|
28
78
|
|
79
|
+
# create default post
|
80
|
+
Notee::Post.skip_callback(:create, :before, :create_authority)
|
81
|
+
Notee::Post.create(title: "Hello World", content: INITIAL_TXT, status: 1, user_id: 0, category_id: 1, seo_description: "hello world! Notee is creating CMS(blog) app by only one command. BackEnd: Ruby(RailsEngine), FrontEnd: React.js + Riot.js(only comment part)", thumbnail_id: 1)
|
82
|
+
Notee::Post.set_callback(:create, :before, :create_authority)
|
83
|
+
|
29
84
|
add_index :notee_posts, :slug, :unique => true
|
30
85
|
end
|
31
86
|
end
|