notee 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +20 -0
- data/Rakefile +44 -4
- data/app/assets/javascripts/application.js +14 -0
- data/app/assets/javascripts/notee/application.js +47366 -0
- data/app/assets/stylesheets/notee/application.css +15 -0
- data/app/assets/stylesheets/notee/images.css +4 -0
- data/app/assets/stylesheets/notee/posts.css +4 -0
- data/app/assets/stylesheets/notee/preview.scss +214 -0
- data/app/assets/stylesheets/scaffold.css +56 -0
- data/app/controllers/notee/application_controller.rb +24 -0
- data/app/controllers/notee/categories_controller.rb +55 -0
- data/app/controllers/notee/images_controller.rb +48 -0
- data/app/controllers/notee/posts_controller.rb +75 -0
- data/app/controllers/notee/tokens_controller.rb +30 -0
- data/app/helpers/notee/application_helper.rb +4 -0
- data/app/helpers/notee/categories_helper.rb +4 -0
- data/app/helpers/notee/images_helper.rb +4 -0
- data/app/helpers/notee/posts_helper.rb +4 -0
- data/app/models/notee/category.rb +4 -0
- data/app/models/notee/image.rb +24 -0
- data/app/models/notee/post.rb +4 -0
- data/app/models/notee/token.rb +18 -0
- data/app/views/layouts/notee/application.html.erb +14 -0
- data/app/views/notee/posts/notee.html.erb +1 -0
- data/app/views/notee/tokens/new.html.erb +5 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20160605141437_create_notee_posts.rb +29 -0
- data/db/migrate/20160605141510_create_notee_categories.rb +15 -0
- data/db/migrate/20160605141547_create_notee_images.rb +14 -0
- data/db/migrate/20160608102012_create_notee_tokens.rb +12 -0
- data/lib/notee.rb +4 -2
- data/lib/notee/configuration.rb +28 -0
- data/lib/notee/engine.rb +13 -0
- data/lib/notee/version.rb +1 -1
- data/lib/tasks/notee_tasks.rake +71 -0
- data/test/controllers/notee/categories_controller_test.rb +52 -0
- data/test/controllers/notee/images_controller_test.rb +52 -0
- data/test/controllers/notee/posts_controller_test.rb +52 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +23 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +16 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +3259 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/notee/categories.yml +13 -0
- data/test/fixtures/notee/images.yml +7 -0
- data/test/fixtures/notee/posts.yml +23 -0
- data/test/fixtures/notee/tokens.yml +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/models/notee/category_test.rb +9 -0
- data/test/models/notee/image_test.rb +9 -0
- data/test/models/notee/post_test.rb +9 -0
- data/test/models/notee/token_test.rb +9 -0
- data/test/notee_test.rb +7 -0
- data/test/test_helper.rb +20 -0
- metadata +195 -33
- data/.gitignore +0 -10
- data/.idea/.name +0 -1
- data/.idea/misc.xml +0 -14
- data/.idea/modules.xml +0 -8
- data/.idea/notee.iml +0 -17
- data/.idea/vcs.xml +0 -6
- data/.idea/workspace.xml +0 -335
- data/.rspec +0 -2
- data/.travis.yml +0 -4
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -21
- data/README.md +0 -41
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/generators/notee/install/install_generator.rb +0 -17
- data/notee.gemspec +0 -28
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,214 @@
|
|
1
|
+
/*
|
2
|
+
Place all the styles related to the matching controller here.
|
3
|
+
They will automatically be included in application.css.
|
4
|
+
*/
|
5
|
+
|
6
|
+
#preview{
|
7
|
+
img{
|
8
|
+
width: 100%;
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
/*
|
14
|
+
|
15
|
+
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
|
16
|
+
|
17
|
+
*/
|
18
|
+
|
19
|
+
.hljs {
|
20
|
+
display: block;
|
21
|
+
overflow-x: auto;
|
22
|
+
padding: 0.5em;
|
23
|
+
color: #333;
|
24
|
+
background: #f8f8f8;
|
25
|
+
}
|
26
|
+
|
27
|
+
.hljs-comment,
|
28
|
+
.hljs-quote {
|
29
|
+
color: #998;
|
30
|
+
font-style: italic;
|
31
|
+
}
|
32
|
+
|
33
|
+
.hljs-keyword,
|
34
|
+
.hljs-selector-tag,
|
35
|
+
.hljs-subst {
|
36
|
+
color: #333;
|
37
|
+
font-weight: bold;
|
38
|
+
}
|
39
|
+
|
40
|
+
.hljs-number,
|
41
|
+
.hljs-literal,
|
42
|
+
.hljs-variable,
|
43
|
+
.hljs-template-variable,
|
44
|
+
.hljs-tag .hljs-attr {
|
45
|
+
color: #008080;
|
46
|
+
}
|
47
|
+
|
48
|
+
.hljs-string,
|
49
|
+
.hljs-doctag {
|
50
|
+
color: #d14;
|
51
|
+
}
|
52
|
+
|
53
|
+
.hljs-title,
|
54
|
+
.hljs-section,
|
55
|
+
.hljs-selector-id {
|
56
|
+
color: #900;
|
57
|
+
font-weight: bold;
|
58
|
+
}
|
59
|
+
|
60
|
+
.hljs-subst {
|
61
|
+
font-weight: normal;
|
62
|
+
}
|
63
|
+
|
64
|
+
.hljs-type,
|
65
|
+
.hljs-class .hljs-title {
|
66
|
+
color: #458;
|
67
|
+
font-weight: bold;
|
68
|
+
}
|
69
|
+
|
70
|
+
.hljs-tag,
|
71
|
+
.hljs-name,
|
72
|
+
.hljs-attribute {
|
73
|
+
color: #000080;
|
74
|
+
font-weight: normal;
|
75
|
+
}
|
76
|
+
|
77
|
+
.hljs-regexp,
|
78
|
+
.hljs-link {
|
79
|
+
color: #009926;
|
80
|
+
}
|
81
|
+
|
82
|
+
.hljs-symbol,
|
83
|
+
.hljs-bullet {
|
84
|
+
color: #990073;
|
85
|
+
}
|
86
|
+
|
87
|
+
.hljs-built_in,
|
88
|
+
.hljs-builtin-name {
|
89
|
+
color: #0086b3;
|
90
|
+
}
|
91
|
+
|
92
|
+
.hljs-meta {
|
93
|
+
color: #999;
|
94
|
+
font-weight: bold;
|
95
|
+
}
|
96
|
+
|
97
|
+
.hljs-deletion {
|
98
|
+
background: #fdd;
|
99
|
+
}
|
100
|
+
|
101
|
+
.hljs-addition {
|
102
|
+
background: #dfd;
|
103
|
+
}
|
104
|
+
|
105
|
+
.hljs-emphasis {
|
106
|
+
font-style: italic;
|
107
|
+
}
|
108
|
+
|
109
|
+
.hljs-strong {
|
110
|
+
font-weight: bold;
|
111
|
+
}
|
112
|
+
|
113
|
+
/*
|
114
|
+
|
115
|
+
vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
|
116
|
+
|
117
|
+
*/
|
118
|
+
|
119
|
+
/*background color*/
|
120
|
+
.hljs {
|
121
|
+
display: block;
|
122
|
+
overflow-x: auto;
|
123
|
+
padding: 0.5em;
|
124
|
+
background: #1d1f21;
|
125
|
+
}
|
126
|
+
|
127
|
+
/*selection color*/
|
128
|
+
.hljs::selection,
|
129
|
+
.hljs span::selection {
|
130
|
+
background: #373b41;
|
131
|
+
}
|
132
|
+
|
133
|
+
.hljs::-moz-selection,
|
134
|
+
.hljs span::-moz-selection {
|
135
|
+
background: #373b41;
|
136
|
+
}
|
137
|
+
|
138
|
+
/*foreground color*/
|
139
|
+
.hljs {
|
140
|
+
color: #c5c8c6;
|
141
|
+
}
|
142
|
+
|
143
|
+
/*color: fg_yellow*/
|
144
|
+
.hljs-title,
|
145
|
+
.hljs-name {
|
146
|
+
color: #f0c674;
|
147
|
+
}
|
148
|
+
|
149
|
+
/*color: fg_comment*/
|
150
|
+
.hljs-comment,
|
151
|
+
.hljs-meta,
|
152
|
+
.hljs-meta .hljs-keyword {
|
153
|
+
color: #707880;
|
154
|
+
}
|
155
|
+
|
156
|
+
/*color: fg_red*/
|
157
|
+
.hljs-number,
|
158
|
+
.hljs-symbol,
|
159
|
+
.hljs-literal,
|
160
|
+
.hljs-deletion,
|
161
|
+
.hljs-link {
|
162
|
+
color: #cc6666
|
163
|
+
}
|
164
|
+
|
165
|
+
/*color: fg_green*/
|
166
|
+
.hljs-string,
|
167
|
+
.hljs-doctag,
|
168
|
+
.hljs-addition,
|
169
|
+
.hljs-regexp,
|
170
|
+
.hljs-selector-attr,
|
171
|
+
.hljs-selector-pseudo {
|
172
|
+
color: #b5bd68;
|
173
|
+
}
|
174
|
+
|
175
|
+
/*color: fg_purple*/
|
176
|
+
.hljs-attribute,
|
177
|
+
.hljs-code,
|
178
|
+
.hljs-selector-id {
|
179
|
+
color: #b294bb;
|
180
|
+
}
|
181
|
+
|
182
|
+
/*color: fg_blue*/
|
183
|
+
.hljs-keyword,
|
184
|
+
.hljs-selector-tag,
|
185
|
+
.hljs-bullet,
|
186
|
+
.hljs-tag {
|
187
|
+
color: #81a2be;
|
188
|
+
}
|
189
|
+
|
190
|
+
/*color: fg_aqua*/
|
191
|
+
.hljs-subst,
|
192
|
+
.hljs-variable,
|
193
|
+
.hljs-template-tag,
|
194
|
+
.hljs-template-variable {
|
195
|
+
color: #8abeb7;
|
196
|
+
}
|
197
|
+
|
198
|
+
/*color: fg_orange*/
|
199
|
+
.hljs-type,
|
200
|
+
.hljs-built_in,
|
201
|
+
.hljs-builtin-name,
|
202
|
+
.hljs-quote,
|
203
|
+
.hljs-section,
|
204
|
+
.hljs-selector-class {
|
205
|
+
color: #de935f;
|
206
|
+
}
|
207
|
+
|
208
|
+
.hljs-emphasis {
|
209
|
+
font-style: italic;
|
210
|
+
}
|
211
|
+
|
212
|
+
.hljs-strong {
|
213
|
+
font-weight: bold;
|
214
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
div.field, div.actions {
|
20
|
+
margin-bottom: 10px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#notice {
|
24
|
+
color: green;
|
25
|
+
}
|
26
|
+
|
27
|
+
.field_with_errors {
|
28
|
+
padding: 2px;
|
29
|
+
background-color: red;
|
30
|
+
display: table;
|
31
|
+
}
|
32
|
+
|
33
|
+
#error_explanation {
|
34
|
+
width: 450px;
|
35
|
+
border: 2px solid red;
|
36
|
+
padding: 7px;
|
37
|
+
padding-bottom: 0;
|
38
|
+
margin-bottom: 20px;
|
39
|
+
background-color: #f0f0f0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#error_explanation h2 {
|
43
|
+
text-align: left;
|
44
|
+
font-weight: bold;
|
45
|
+
padding: 5px 5px 5px 15px;
|
46
|
+
font-size: 12px;
|
47
|
+
margin: -7px;
|
48
|
+
margin-bottom: 0px;
|
49
|
+
background-color: #c00;
|
50
|
+
color: #fff;
|
51
|
+
}
|
52
|
+
|
53
|
+
#error_explanation ul li {
|
54
|
+
font-size: 12px;
|
55
|
+
list-style: square;
|
56
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Notee
|
2
|
+
class ApplicationController < ActionController::Base
|
3
|
+
|
4
|
+
before_filter :set_access_token
|
5
|
+
before_filter :restrict_access_json
|
6
|
+
|
7
|
+
private
|
8
|
+
def set_access_token
|
9
|
+
p "TODO: add access_token to http header"
|
10
|
+
# request['Authorization: Token token'] = session[:access_token] if session[:access_token].present?
|
11
|
+
end
|
12
|
+
|
13
|
+
def restrict_access_json
|
14
|
+
# authenticate_or_request_with_http_token do |token, options|
|
15
|
+
# Token.exists?(access_token: token)
|
16
|
+
# end
|
17
|
+
|
18
|
+
unless Token.exists?(access_token: session[:access_token])
|
19
|
+
raise
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
|
2
|
+
require_dependency "notee/application_controller"
|
3
|
+
|
4
|
+
module Notee
|
5
|
+
class CategoriesController < ApplicationController
|
6
|
+
before_action :set_category, only: [:update, :destroy]
|
7
|
+
|
8
|
+
def index
|
9
|
+
@categories = Category.all
|
10
|
+
render json: { status: 'success', categories: @categories}
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
@category = Category.new(category_params)
|
15
|
+
respond_to do |format|
|
16
|
+
if @category.save
|
17
|
+
format.json { render json: @category, status: 200 }
|
18
|
+
else
|
19
|
+
format.json { render json: @category.errors, status: :unprocessable_entity }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def update
|
25
|
+
respond_to do |format|
|
26
|
+
if @category.update(category_params)
|
27
|
+
format.json { render json: @category, status: 200 }
|
28
|
+
else
|
29
|
+
format.json { render json: @category.errors, status: :unprocessable_entity }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def destroy
|
35
|
+
respond_to do |format|
|
36
|
+
if @category.destroy
|
37
|
+
format.json { render json: @category, status: 200 }
|
38
|
+
else
|
39
|
+
format.json { render json: @category.errors, status: :internal_server_error }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def category_params
|
47
|
+
params.require(:category).permit(:name, :content, :slug, :status, :category_id, :thumbnail_id, :published_at, :seo_keyword, :seo_description)
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_category
|
51
|
+
@category = Category.find_by(id: params[:id])
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require_dependency "notee/application_controller"
|
3
|
+
|
4
|
+
module Notee
|
5
|
+
class ImagesController < ApplicationController
|
6
|
+
|
7
|
+
def index
|
8
|
+
@images = Image.all
|
9
|
+
render json: { status: 'success', images: @images}
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
|
14
|
+
@image = Image.new
|
15
|
+
@image.file = params[:image]
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
if @image.save
|
19
|
+
format.json { render json: @image, status: 200 }
|
20
|
+
else
|
21
|
+
format.json { render json: @image.errors, status: :unprocessable_entity }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def destroy
|
27
|
+
return unless @del_img = Image.find_by(content: params[:name])
|
28
|
+
|
29
|
+
Image.transaction do
|
30
|
+
image_dir = Rails.root.to_s + "/public/notee/"
|
31
|
+
File.delete(image_dir + @del_img.content)
|
32
|
+
respond_to do |format|
|
33
|
+
if @del_img.destroy
|
34
|
+
format.json { render json: @del_img, status: 200 }
|
35
|
+
else
|
36
|
+
format.json { render json: @del_img.errors, status: :internal_server_error }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def image_params
|
45
|
+
params.require(:image).permit(:title, :content, :slug, :status, :image_id, :thumbnail_id, :published_at, :seo_keyword, :seo_description)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require_dependency "notee/application_controller"
|
2
|
+
|
3
|
+
module Notee
|
4
|
+
class PostsController < ApplicationController
|
5
|
+
|
6
|
+
before_action :set_post, only: [:show, :update, :destroy]
|
7
|
+
skip_before_filter :restrict_access_json, only: [:notee]
|
8
|
+
before_filter :restrict_access, only: [:notee]
|
9
|
+
|
10
|
+
def notee
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /posts
|
14
|
+
def index
|
15
|
+
@posts = Post.all
|
16
|
+
render json: { status: 'success', posts: @posts}
|
17
|
+
end
|
18
|
+
|
19
|
+
# GET /posts/1
|
20
|
+
def show
|
21
|
+
render json: { status: 'success', post: @post}
|
22
|
+
end
|
23
|
+
|
24
|
+
# POST /posts
|
25
|
+
def create
|
26
|
+
@post = Post.new(post_params)
|
27
|
+
respond_to do |format|
|
28
|
+
if @post.save
|
29
|
+
format.json { render json: @post, status: 200 }
|
30
|
+
else
|
31
|
+
format.json { render json: @post.errors, status: :unprocessable_entity }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# PATCH/PUT /posts/1
|
37
|
+
def update
|
38
|
+
respond_to do |format|
|
39
|
+
if @post.update(post_params)
|
40
|
+
format.json { render json: @post, status: 200 }
|
41
|
+
else
|
42
|
+
format.json { render json: @post.errors, status: :unprocessable_entity }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# DELETE /posts/1
|
48
|
+
def destroy
|
49
|
+
@post.destroy
|
50
|
+
render json: { status: 'success'}
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def set_post
|
56
|
+
@post = Post.find_by(id: params[:id])
|
57
|
+
end
|
58
|
+
|
59
|
+
# Only allow a trusted parameter "white list" through.
|
60
|
+
def post_params
|
61
|
+
params.require(:post).permit(:title, :content, :slug, :status, :category_id, :thumbnail_id, :published_at, :seo_keyword, :seo_description)
|
62
|
+
end
|
63
|
+
|
64
|
+
def restrict_access
|
65
|
+
# authenticate_or_request_with_http_token do |token, options|
|
66
|
+
# Token.exists?(access_token: token)
|
67
|
+
# end
|
68
|
+
|
69
|
+
unless Token.exists?(access_token: session[:access_token])
|
70
|
+
redirect_to new_token_path and return
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|