unsakini 0.0.3.1 → 0.0.4.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -6
  3. data/angular/angular-cli.json +5 -3
  4. data/angular/npm-debug.log +54 -0
  5. data/angular/package.json +4 -1
  6. data/angular/src/app/app.component.html +1 -4
  7. data/angular/src/app/app.module.ts +8 -7
  8. data/angular/src/app/app.routes.module.ts +12 -2
  9. data/angular/src/app/confirm-account/confirm-account.component.ts +27 -0
  10. data/angular/src/app/confirm-account/confirm-account.html +41 -0
  11. data/angular/src/app/confirm-account/confirm-account.module.ts +24 -0
  12. data/angular/src/app/confirm-account/confirm-account.scss +3 -0
  13. data/angular/src/app/confirm-account/confirm-account.service.ts +27 -0
  14. data/angular/src/app/confirm-account/index.ts +3 -0
  15. data/angular/src/app/index.ts +2 -0
  16. data/angular/src/app/login/index.ts +3 -0
  17. data/angular/src/app/login/login.component.ts +40 -0
  18. data/angular/src/app/login/login.html +43 -0
  19. data/angular/src/app/login/login.module.ts +27 -0
  20. data/angular/src/app/login/login.service.ts +48 -0
  21. data/angular/src/app/registration/index.ts +3 -0
  22. data/angular/src/app/registration/registration.component.html +70 -12
  23. data/angular/src/app/registration/registration.component.spec.ts +8 -11
  24. data/angular/src/app/registration/registration.component.ts +10 -8
  25. data/angular/src/app/registration/registration.module.ts +23 -0
  26. data/angular/src/app/registration/registration.service.ts +46 -0
  27. data/angular/src/app/registration/registration.services.spec.ts +71 -0
  28. data/angular/src/app/services/auth-http/auth.http.service.ts +35 -0
  29. data/angular/src/app/services/auth-http/index.ts +1 -0
  30. data/angular/src/app/services/http/http.service.spec.ts +205 -0
  31. data/angular/src/app/services/http/http.service.ts +40 -0
  32. data/angular/src/app/services/http/index.ts +1 -0
  33. data/angular/src/app/services/index.ts +3 -0
  34. data/angular/src/app/services/services.module.ts +33 -0
  35. data/angular/src/assets/global.scss +3 -0
  36. data/angular/src/environments/custom.ts +4 -0
  37. data/angular/src/environments/environment.prod.ts +2 -1
  38. data/angular/src/environments/environment.ts +2 -1
  39. data/angular/src/index.html +1 -1
  40. data/app/controllers/application_controller.rb +2 -2
  41. data/app/controllers/concerns/unsakini/board_owner_controller_concern.rb +42 -0
  42. data/app/controllers/concerns/unsakini/comment_owner_controller_concern.rb +36 -0
  43. data/app/controllers/concerns/unsakini/logged_in_controller_concern.rb +23 -0
  44. data/app/controllers/concerns/unsakini/post_owner_controller_concern.rb +38 -0
  45. data/app/controllers/concerns/unsakini/serializer_controller_concern.rb +13 -0
  46. data/app/controllers/unsakini/base_controller.rb +6 -0
  47. data/app/controllers/unsakini/boards_controller.rb +76 -0
  48. data/app/controllers/unsakini/comments_controller.rb +54 -0
  49. data/app/controllers/unsakini/posts_controller.rb +61 -0
  50. data/app/controllers/unsakini/share_board_controller.rb +122 -0
  51. data/app/controllers/unsakini/user_token_controller.rb +17 -0
  52. data/app/controllers/unsakini/users_controller.rb +69 -0
  53. data/app/controllers/unsakini/web_controller.rb +27 -0
  54. data/app/mailers/unsakini/user_mailer.rb +13 -0
  55. data/app/models/concerns/unsakini/encryptable_model_concern.rb +97 -0
  56. data/app/models/unsakini/application_record.rb +7 -0
  57. data/app/models/unsakini/board.rb +16 -0
  58. data/app/models/unsakini/comment.rb +12 -0
  59. data/app/models/unsakini/post.rb +15 -0
  60. data/app/models/unsakini/user.rb +43 -0
  61. data/app/models/unsakini/user_board.rb +84 -0
  62. data/app/models/unsakini.rb +5 -0
  63. data/app/serializers/unsakini/board_serializer.rb +7 -0
  64. data/app/serializers/{comment_serializer.rb → unsakini/comment_serializer.rb} +6 -3
  65. data/app/serializers/unsakini/post_serializer.rb +26 -0
  66. data/app/serializers/unsakini/user_board_serializer.rb +14 -0
  67. data/app/serializers/{user_serializer.rb → unsakini/user_serializer.rb} +5 -2
  68. data/app/views/unsakini/user_mailer/confirm_account.html.erb +3 -0
  69. data/app/views/unsakini/web/index.html.erb +343 -0
  70. data/config/routes.rb +10 -10
  71. data/db/migrate/20161116114222_create_unsakini_boards.rb +10 -0
  72. data/db/migrate/{20161116200034_create_user_boards.rb → 20161116200034_create_unsakini_user_boards.rb} +3 -2
  73. data/db/migrate/{20161118031023_create_posts.rb → 20161118031023_create_unsakini_posts.rb} +2 -2
  74. data/db/migrate/{20161118100454_create_comments.rb → 20161118100454_create_unsakini_comments.rb} +2 -2
  75. data/db/migrate/20161126145352_create_unsakini_users.rb +15 -0
  76. data/lib/generators/unsakini/config/config_generator.rb +3 -1
  77. data/lib/generators/unsakini/dependencies/USAGE +5 -0
  78. data/lib/generators/unsakini/dependencies/dependencies_generator.rb +19 -0
  79. data/lib/tasks/unsakini_tasks.rake +6 -37
  80. data/lib/unsakini/engine.rb +6 -0
  81. data/lib/unsakini/version.rb +1 -1
  82. data/public/css/all.css +1204 -0
  83. data/public/css/all.css.map +7 -0
  84. data/public/css/bootstrap.css +5622 -0
  85. data/public/css/bootstrap.css.map +7 -0
  86. data/public/css/custom.css +15 -0
  87. data/public/favicons/android-chrome-144x144.png +0 -0
  88. data/public/favicons/android-chrome-192x192.png +0 -0
  89. data/public/favicons/android-chrome-36x36.png +0 -0
  90. data/public/favicons/android-chrome-48x48.png +0 -0
  91. data/public/favicons/android-chrome-72x72.png +0 -0
  92. data/public/favicons/android-chrome-96x96.png +0 -0
  93. data/public/favicons/apple-touch-icon-114x114.png +0 -0
  94. data/public/favicons/apple-touch-icon-120x120.png +0 -0
  95. data/public/favicons/apple-touch-icon-144x144.png +0 -0
  96. data/public/favicons/apple-touch-icon-152x152.png +0 -0
  97. data/public/favicons/apple-touch-icon-180x180.png +0 -0
  98. data/public/favicons/apple-touch-icon-57x57.png +0 -0
  99. data/public/favicons/apple-touch-icon-60x60.png +0 -0
  100. data/public/favicons/apple-touch-icon-72x72.png +0 -0
  101. data/public/favicons/apple-touch-icon-76x76.png +0 -0
  102. data/public/favicons/apple-touch-icon-precomposed.png +0 -0
  103. data/public/favicons/apple-touch-icon.png +0 -0
  104. data/public/favicons/favicon-16x16.png +0 -0
  105. data/public/favicons/favicon-194x194.png +0 -0
  106. data/public/favicons/favicon-32x32.png +0 -0
  107. data/public/favicons/favicon-96x96.png +0 -0
  108. data/public/favicons/favicon.ico +0 -0
  109. data/public/favicons/mstile-144x144.png +0 -0
  110. data/public/favicons/mstile-150x150.png +0 -0
  111. data/public/favicons/mstile-310x150.png +0 -0
  112. data/public/favicons/mstile-310x310.png +0 -0
  113. data/public/favicons/mstile-70x70.png +0 -0
  114. data/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  115. data/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
  116. data/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  117. data/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  118. data/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  119. data/public/fonts/font-awesome-4.3.0/css/font-awesome.css +1801 -0
  120. data/public/fonts/font-awesome-4.3.0/css/font-awesome.min.css +4 -0
  121. data/public/fonts/font-awesome-4.3.0/fonts/FontAwesome.otf +0 -0
  122. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.eot +0 -0
  123. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.svg +565 -0
  124. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf +0 -0
  125. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff +0 -0
  126. data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 +0 -0
  127. data/public/images/graph-01.svg +425 -0
  128. data/public/images/graph-02.svg +435 -0
  129. data/public/images/graph-03.svg +576 -0
  130. data/public/images/graph-04.svg +70 -0
  131. data/public/images/img-01.png +0 -0
  132. data/public/images/img-decor-01.jpg +0 -0
  133. data/public/images/img-decor-02.jpg +0 -0
  134. data/public/images/img-decor-03.jpg +0 -0
  135. data/public/images/img-social-placeholder-01.png +0 -0
  136. data/public/images/logo-cb.png +0 -0
  137. data/public/images/logo-codrops.png +0 -0
  138. data/public/images/logo-pixel.png +0 -0
  139. data/public/images/logo-smashing.png +0 -0
  140. data/public/images/logo-tnw.png +0 -0
  141. data/public/images/logo-w.png +0 -0
  142. data/public/images/unsakini.svg +56 -0
  143. data/public/images/user-01.jpg +0 -0
  144. data/public/images/user-02.jpg +0 -0
  145. data/public/images/user-03.jpg +0 -0
  146. data/public/js/bootstrap.js +2306 -0
  147. data/public/js/jquery-1.11.2.min.js +4 -0
  148. data/public/js/jquery.main.js +603 -0
  149. data/public/manifest.json +41 -0
  150. data/public/unsakini/app/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
  151. data/public/unsakini/app/89889688147bd7575d6327160d64e760.svg +288 -0
  152. data/public/unsakini/app/assets/global.scss +3 -0
  153. data/public/unsakini/app/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
  154. data/public/unsakini/app/f4769f9bdb7466be65088239c12046d1.eot +0 -0
  155. data/public/unsakini/app/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
  156. data/{angular/dist → public/unsakini/app}/favicon.ico +0 -0
  157. data/public/unsakini/app/index.html +14 -0
  158. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.js +2 -0
  159. data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.map +1 -0
  160. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js +2152 -0
  161. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js.gz +0 -0
  162. data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.map +1 -0
  163. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.js +2 -0
  164. data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.map +1 -0
  165. data/public/unsakini/app/styles.5dac0e986fce6f8738b300cb558b56a0.bundle.css +8 -0
  166. data/spec/concerns/models/encryptable_concern.rb +3 -2
  167. data/spec/controllers/{web_base_controller_spec.rb → web_controller_spec.rb} +5 -4
  168. data/spec/dummy/config/application.rb +3 -1
  169. data/spec/dummy/config/environments/development.rb +2 -0
  170. data/spec/dummy/config/initializers/knock.rb +59 -0
  171. data/spec/dummy/db/schema.rb +16 -14
  172. data/spec/dummy/db/test.sqlite3 +0 -0
  173. data/spec/factories/boards.rb +1 -1
  174. data/spec/factories/comments.rb +1 -1
  175. data/spec/factories/posts.rb +1 -1
  176. data/spec/factories/user_boards.rb +1 -1
  177. data/spec/factories/users.rb +1 -1
  178. data/spec/models/board_spec.rb +2 -2
  179. data/spec/models/comment_spec.rb +2 -2
  180. data/spec/models/post_spec.rb +2 -2
  181. data/spec/models/user_board_spec.rb +19 -19
  182. data/spec/models/user_spec.rb +1 -1
  183. data/spec/requests/{api/boards/api_boards_crud_spec.rb → boards/boards_crud_spec.rb} +26 -26
  184. data/spec/requests/{api/boards/api_boards_pagination_spec.rb → boards/boards_pagination_spec.rb} +7 -7
  185. data/spec/requests/{api/boards/api_private_board_spec.rb → boards/private_board_spec.rb} +26 -26
  186. data/spec/requests/{api/boards/api_shared_board_spec.rb → boards/shared_board_spec.rb} +9 -9
  187. data/spec/requests/{api/boards/api_sharing_board_spec.rb → boards/sharing_board_spec.rb} +13 -13
  188. data/spec/requests/{api/comments/api_comments_pagination_spec.rb → comments/comments_pagination_spec.rb} +3 -3
  189. data/spec/requests/{api/comments/api_comments_private_board_spec.rb → comments/comments_private_board_spec.rb} +20 -20
  190. data/spec/requests/{api/comments/api_comments_shared_board_spec.rb → comments/comments_shared_board_spec.rb} +17 -17
  191. data/spec/requests/{api/posts/api_posts_pagination_spec.rb → posts/posts_pagination_spec.rb} +3 -3
  192. data/spec/requests/{api/posts/api_posts_private_board_spec.rb → posts/posts_private_board_spec.rb} +22 -22
  193. data/spec/requests/{api/posts/api_posts_shared_board_spec.rb → posts/posts_shared_board_spec.rb} +24 -24
  194. data/spec/requests/user/user_create_spec.rb +104 -0
  195. data/spec/requests/{api/api_users_spec.rb → user/user_search_spec.rb} +9 -9
  196. data/spec/schema/jwt.json +9 -0
  197. data/spec/schema/validation_message.json +4 -0
  198. data/spec/spec_helper.rb +2 -0
  199. data/spec/support/auth_helper.rb +0 -2
  200. metadata +204 -199
  201. data/angular/dist/index.html +0 -14
  202. data/angular/dist/inline.bundle.js +0 -139
  203. data/angular/dist/inline.map +0 -1
  204. data/angular/dist/main.bundle.js +0 -64689
  205. data/angular/dist/main.map +0 -1
  206. data/angular/dist/styles.bundle.js +0 -364
  207. data/angular/dist/styles.map +0 -1
  208. data/angular/src/styles.css +0 -1
  209. data/app/controllers/api/boards_controller.rb +0 -73
  210. data/app/controllers/api/comments_controller.rb +0 -51
  211. data/app/controllers/api/posts_controller.rb +0 -58
  212. data/app/controllers/api/share_board_controller.rb +0 -118
  213. data/app/controllers/api/users_controller.rb +0 -27
  214. data/app/controllers/concerns/board_owner_controller_concern.rb +0 -38
  215. data/app/controllers/concerns/comment_owner_controller_concern.rb +0 -33
  216. data/app/controllers/concerns/logged_in_controller_concern.rb +0 -21
  217. data/app/controllers/concerns/post_owner_controller_concern.rb +0 -36
  218. data/app/controllers/concerns/serializer_controller_concern.rb +0 -11
  219. data/app/controllers/user_token_controller.rb +0 -2
  220. data/app/controllers/web_base_controller.rb +0 -15
  221. data/app/models/application_record.rb +0 -5
  222. data/app/models/board.rb +0 -14
  223. data/app/models/comment.rb +0 -9
  224. data/app/models/concerns/encryptable_model_concern.rb +0 -96
  225. data/app/models/post.rb +0 -12
  226. data/app/models/user.rb +0 -6
  227. data/app/models/user_board.rb +0 -82
  228. data/app/serializers/board_serializer.rb +0 -5
  229. data/app/serializers/post_serializer.rb +0 -23
  230. data/app/serializers/user_board_serializer.rb +0 -11
  231. data/app/views/web_base/index.html +0 -16
  232. data/db/migrate/20161116114222_create_boards.rb +0 -9
  233. data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +0 -5
  234. data/db/migrate/20161122211105_create_users.rb +0 -12
  235. data/db/migrate/20161124102633_add_is_shared_to_boards.rb +0 -5
  236. data/lib/generators/unsakini/angular/USAGE +0 -8
  237. data/lib/generators/unsakini/angular/angular_generator.rb +0 -7
  238. data/spec/dummy/config/initializers/assets.rb +0 -11
  239. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
  240. data/spec/dummy/config/initializers/session_store.rb +0 -3
  241. data/spec/dummy/db/development.sqlite3 +0 -0
  242. data/spec/dummy/db/migrate/20161124210219_create_boards.unsakini_engine.rb +0 -10
  243. data/spec/dummy/db/migrate/20161124210220_create_user_boards.unsakini_engine.rb +0 -12
  244. data/spec/dummy/db/migrate/20161124210221_create_posts.unsakini_engine.rb +0 -13
  245. data/spec/dummy/db/migrate/20161124210222_create_comments.unsakini_engine.rb +0 -12
  246. data/spec/dummy/db/migrate/20161124210223_add_encrypted_password_to_user_board.unsakini_engine.rb +0 -6
  247. data/spec/dummy/db/migrate/20161124210224_create_users.unsakini_engine.rb +0 -13
  248. data/spec/dummy/db/migrate/20161124210225_add_is_shared_to_boards.unsakini_engine.rb +0 -6
  249. data/spec/dummy/public/app/favicon.ico +0 -0
  250. data/spec/dummy/public/app/index.html +0 -14
  251. data/spec/dummy/public/app/inline.bundle.js +0 -139
  252. data/spec/dummy/public/app/inline.map +0 -1
  253. data/spec/dummy/public/app/main.bundle.js +0 -64689
  254. data/spec/dummy/public/app/main.map +0 -1
  255. data/spec/dummy/public/app/styles.bundle.js +0 -364
  256. data/spec/dummy/public/app/styles.map +0 -1
  257. data/spec/dummy/tmp/unsakini-ng2/LICENSE +0 -21
  258. data/spec/dummy/tmp/unsakini-ng2/README.md +0 -1
  259. data/spec/dummy/tmp/unsakini-ng2/angular-cli.json +0 -59
  260. data/spec/dummy/tmp/unsakini-ng2/e2e/app.e2e-spec.ts +0 -14
  261. data/spec/dummy/tmp/unsakini-ng2/e2e/app.po.ts +0 -11
  262. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.e2e-spec.ts +0 -28
  263. data/spec/dummy/tmp/unsakini-ng2/e2e/signup.po.ts +0 -31
  264. data/spec/dummy/tmp/unsakini-ng2/e2e/tsconfig.json +0 -16
  265. data/spec/dummy/tmp/unsakini-ng2/karma.conf.js +0 -45
  266. data/spec/dummy/tmp/unsakini-ng2/package.json +0 -49
  267. data/spec/dummy/tmp/unsakini-ng2/protractor.conf.js +0 -32
  268. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.css +0 -0
  269. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.html +0 -4
  270. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.spec.ts +0 -47
  271. data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.ts +0 -10
  272. data/spec/dummy/tmp/unsakini-ng2/src/app/app.module.ts +0 -29
  273. data/spec/dummy/tmp/unsakini-ng2/src/app/app.routes.module.ts +0 -29
  274. data/spec/dummy/tmp/unsakini-ng2/src/app/index.ts +0 -2
  275. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.css +0 -0
  276. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.html +0 -14
  277. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.spec.ts +0 -157
  278. data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.ts +0 -42
  279. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.prod.ts +0 -3
  280. data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.ts +0 -8
  281. data/spec/dummy/tmp/unsakini-ng2/src/favicon.ico +0 -0
  282. data/spec/dummy/tmp/unsakini-ng2/src/index.html +0 -14
  283. data/spec/dummy/tmp/unsakini-ng2/src/main.ts +0 -12
  284. data/spec/dummy/tmp/unsakini-ng2/src/polyfills.ts +0 -19
  285. data/spec/dummy/tmp/unsakini-ng2/src/styles.css +0 -1
  286. data/spec/dummy/tmp/unsakini-ng2/src/test.ts +0 -31
  287. data/spec/dummy/tmp/unsakini-ng2/src/tsconfig.json +0 -18
  288. data/spec/dummy/tmp/unsakini-ng2/src/typings.d.ts +0 -2
  289. data/spec/dummy/tmp/unsakini-ng2/tslint.json +0 -114
  290. data/spec/dummy/tmp/unsakini-ng2/typings.json +0 -4
@@ -1,27 +0,0 @@
1
- class Api::UsersController < ApplicationController
2
-
3
- include LoggedInControllerConcern
4
- include ::ActionController::Serialization
5
-
6
- # Renders the current user as json
7
- #
8
- # `GET /api/user/:id`
9
- #
10
- def show
11
- render json: @user
12
- end
13
-
14
- # Returns the user with matching email
15
- #
16
- # `GET /api/users/search?email=xxx`
17
- #
18
- def search
19
- user = User.where("email = ? AND id != ?", params[:email], @user.id).first
20
- if user
21
- render json: user
22
- else
23
- render json: {}, status: :not_found
24
- end
25
- end
26
-
27
- end
@@ -1,38 +0,0 @@
1
- #Ensure user has access to the board and sets the `@board` variable in the controller
2
- module BoardOwnerControllerConcern
3
- extend ActiveSupport::Concern
4
-
5
- #Ensure user has access to the board and sets the `@board` variable in the controller
6
- def ensure_board
7
- board_id = params[:board_id] || params[:id]
8
- result = has_board_access(board_id)
9
- @board = result[:board]
10
- @user_board = result[:user_board]
11
- render json: {}, status: result[:status] if result[:status] != :ok
12
- end
13
-
14
- # Validate if user has access to board
15
- #
16
- # @param board_id [Integer] board id
17
- def has_board_access(board_id)
18
- board = nil
19
- if !board_id.nil?
20
- board = Board.find_by_id(board_id)
21
- else
22
- return {status: :bad_request}
23
- end
24
- if (board)
25
- user_board = UserBoard.where(user_id: @user.id, board_id: board_id).first
26
- return {status: :forbidden }if user_board.nil?
27
- return {status: :ok, board: board, user_board: user_board}
28
- else
29
- return {status: :not_found}
30
- end
31
- end
32
-
33
- #Ensures user is owner of the board. Must be run after {#ensure_board} method.
34
- def ensure_board_owner
35
- render json: {}, status: :forbidden if !@user_board.is_admin
36
- end
37
-
38
- end
@@ -1,33 +0,0 @@
1
- # Ensures user is owner of the comment and sets the `@comment` variable in the controllers
2
- module CommentOwnerControllerConcern
3
- extend ActiveSupport::Concern
4
-
5
- # Ensures user is owner of the comment and sets the `@comment` variable in the controllers
6
- def ensure_comment
7
- post_id = params[:post_id]
8
- comment_id = params[:comment_id] || params[:id]
9
- result = has_comment_access post_id, comment_id
10
- @comment = result[:comment]
11
- status = result[:status]
12
- render json: {}, status: status if status != :ok
13
- end
14
-
15
- # Validate if user has access to comment in the post
16
- #
17
- # @param post_id [Integer] post id
18
- # @param comment_id [Integer] comment id
19
- def has_comment_access(post_id, comment_id)
20
- comment = Comment.where(id: comment_id, post_id: post_id, user_id: @user.id).first
21
- if comment.nil?
22
- return {status: :forbidden, comment: comment}
23
- else
24
- return {status: :ok, comment: comment}
25
- end
26
- end
27
-
28
- # Ensures user is the owner of the comment. Must be run after {#ensure_comment} method.
29
- def ensure_comment_owner
30
- render json: {}, status: :forbidden if @comment.user_id != @user.id
31
- end
32
-
33
- end
@@ -1,21 +0,0 @@
1
- # Ensures users are logged in and sets `@user` instance variable in the controllers.
2
- # This is included in the base api controller.
3
- #
4
- # Returns `401` error if user is not authenticated
5
- module LoggedInControllerConcern
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- include Knock::Authenticable
10
- before_action :authenticate_user
11
- before_action :set_user
12
- end
13
-
14
- private
15
- # Sets the `@user` variable in the controllers
16
- def set_user
17
- render json: {}, status: :unauthorized if current_user.nil?
18
- @user = current_user
19
- end
20
-
21
- end
@@ -1,36 +0,0 @@
1
- # Ensures user is owner of the post and sets the `@post` variable in the controllers
2
- module PostOwnerControllerConcern
3
- extend ActiveSupport::Concern
4
-
5
- # Ensures user is owner of the post and sets the `@post` variable in the controllers
6
- def ensure_post
7
- post_id = params[:post_id] || params[:id]
8
- board_id = params[:board_id]
9
- result = has_post_access(board_id, post_id)
10
- status = result[:status]
11
- @post = result[:post]
12
- render json: {}, status: status if status != :ok
13
- end
14
-
15
- # Validate if user has access to the post in the board
16
- #
17
- # @param board_id [Integer] board id
18
- # @param post_id [Integer] post id
19
- def has_post_access(board_id, post_id)
20
- post = Post.where(id: post_id, board_id: board_id)
21
- .joins("LEFT JOIN user_boards ON user_boards.board_id = posts.board_id")
22
- .where("user_boards.user_id = ?", @user.id)
23
- .first
24
- if post.nil?
25
- return {status: :forbidden}
26
- else
27
- return {status: :ok, post: post}
28
- end
29
- end
30
-
31
- # Ensures user is owner of the post. Must be run after {#ensure_post}`.
32
- def ensure_post_owner
33
- render json: {}, status: :forbidden if @post.user_id != @user.id
34
- end
35
-
36
- end
@@ -1,11 +0,0 @@
1
- module SerializerControllerConcern
2
-
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- include ::ActionController::Serialization
7
- # respond_to :json
8
- end
9
-
10
-
11
- end
@@ -1,2 +0,0 @@
1
- class UserTokenController < Knock::AuthTokenController
2
- end
@@ -1,15 +0,0 @@
1
- # Base controller for web pages
2
-
3
- class WebBaseController < ActionController::Base
4
- include ActionController::ImplicitRender
5
- include ActionView::Layouts
6
-
7
- # Renders welcome page
8
- def index
9
- end
10
-
11
- # Renders the angular index view when request url is /app/* to enable html5 pushState capability of angularjs
12
- def app
13
- render file: "#{Rails.root}/public/app/index.html", layout: false
14
- end
15
- end
@@ -1,5 +0,0 @@
1
- # Base application model
2
-
3
- class ApplicationRecord < ActiveRecord::Base
4
- self.abstract_class = true
5
- end
data/app/models/board.rb DELETED
@@ -1,14 +0,0 @@
1
- #Board model
2
-
3
- class Board < ApplicationRecord
4
- include EncryptableModelConcern
5
- encryptable_attributes :name
6
-
7
- validates :name, presence: true
8
-
9
- has_many :users, through: :user_boards
10
-
11
- has_many :user_boards, :dependent => :delete_all
12
- has_many :posts, :dependent => :destroy
13
-
14
- end
@@ -1,9 +0,0 @@
1
- #Comment model
2
- class Comment < ApplicationRecord
3
- include EncryptableModelConcern
4
- encryptable_attributes :content
5
- validates :content, presence: true
6
-
7
- belongs_to :post
8
- belongs_to :user
9
- end
@@ -1,96 +0,0 @@
1
- require 'openssl'
2
- require 'base64'
3
-
4
- # Responsible for encryption and decryption of certain model attributes
5
-
6
- module EncryptableModelConcern
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- before_save :encrypt_encryptable_attributes
11
- after_save :decrypt_encryptable_attributes
12
- after_find :decrypt_encryptable_attributes
13
- end
14
-
15
- module ClassMethods
16
- # Sets the `encryptable_attributes` class instance variable in the model.
17
- #
18
- # Encryptable attributes are encrypted before saving using `before_save` hook and decrypted using `after_save` and `after_find` hooks.
19
- #
20
- # Example:
21
- # ```
22
- # class Board < BaseModel
23
- # encryptable_attributes :name, :title, :content
24
- # end
25
- # ```
26
- # @param attrs [Symbol] model attributes
27
- #
28
- def encryptable_attributes(*attrs)
29
- @encryptable_attributes = attrs
30
- end
31
-
32
- end
33
-
34
- # Returns the model's `encryptable_attributes` class instance variable.
35
- #
36
- def encryptable_attributes
37
- self.class.instance_variable_get(:@encryptable_attributes) || []
38
- end
39
-
40
- private
41
- # Encryptes the model's encryptable attributes before saving using Rails' `before_save` hook.
42
- #
43
- # **Note: Be careful in calling this method manually as it can corrupt the data.**
44
- def encrypt_encryptable_attributes
45
- encryptable_attributes.each do |k|
46
- self[k] = encrypt(self[k])
47
- end
48
- end
49
-
50
- # Decrypts the model's encryptable attributes using Rails' `after_save` and `after_find` hooks.
51
- #
52
- # **Note: Be careful in calling this method manually as it can corrupt the data.**
53
- def decrypt_encryptable_attributes
54
- encryptable_attributes.each do |k|
55
- self[k] = decrypt(self[k])
56
- end
57
- end
58
-
59
- # Determins if the value being encrypted/decryped is empty.
60
- def is_empty_val(value)
61
- !value or value.nil? or value == ""
62
- end
63
-
64
- # Returns the cipher algorithm used
65
- def cipher
66
- OpenSSL::Cipher::Cipher.new('aes-256-cbc')
67
- end
68
-
69
- # Returns the encryption key from the `unsakini_crypto_key` config
70
- def cipher_key
71
- begin
72
- Rails.configuration.unsakini_crypto_key
73
- rescue Exception => e
74
- raise 'Encryption key is not set! Please run `rails g unsakini:config` before you proceed.'
75
- end
76
- end
77
-
78
- # Encrypts model attribute value
79
- def encrypt(value)
80
- return value if is_empty_val(value)
81
- c = cipher.encrypt
82
- c.key = Digest::SHA256.digest(cipher_key)
83
- c.iv = iv = c.random_iv
84
- Base64.encode64(iv) + Base64.encode64(c.update(value.to_s) + c.final)
85
- end
86
-
87
- # Decrypts model attribute value
88
- def decrypt(value)
89
- return value if is_empty_val(value)
90
- c = cipher.decrypt
91
- c.key = Digest::SHA256.digest(cipher_key)
92
- c.iv = Base64.decode64 value.slice!(0,25)
93
- c.update(Base64.decode64(value.to_s)) + c.final
94
- end
95
-
96
- end
data/app/models/post.rb DELETED
@@ -1,12 +0,0 @@
1
- #Post model
2
-
3
- class Post < ApplicationRecord
4
- include EncryptableModelConcern
5
- encryptable_attributes :title, :content
6
- validates :title, presence: true
7
- validates :content, presence: true
8
-
9
- belongs_to :user
10
- belongs_to :board
11
- has_many :comments, :dependent => :delete_all
12
- end
data/app/models/user.rb DELETED
@@ -1,6 +0,0 @@
1
- class User < ApplicationRecord
2
- has_secure_password
3
- has_many :user_boards
4
- has_many :boards, through: :user_boards
5
-
6
- end
@@ -1,82 +0,0 @@
1
- # UserBoard model, links the user and it's boards
2
-
3
- class UserBoard < ApplicationRecord
4
- include EncryptableModelConcern
5
- encryptable_attributes :encrypted_password
6
-
7
- validates :encrypted_password, :presence => true, if: :is_admin
8
-
9
- before_validation :validate_before_create, on: :create
10
- before_validation :validate_before_update, on: :update
11
-
12
- belongs_to :user
13
- belongs_to :board
14
-
15
- scope :admin, -> { where(is_admin: true) }
16
-
17
- def name=(str)
18
- @name = str
19
- end
20
-
21
- def name
22
- if !@name.nil?
23
- @name
24
- else
25
- self.board.name
26
- end
27
- end
28
-
29
- # Returns user_boards where {Board} is `is_shared`
30
- #
31
- # @param is_shared [Boolean] wether to return shared or not shared boards
32
- def self.shared(is_shared)
33
- joins("LEFT JOIN boards ON user_boards.board_id = boards.id")
34
- .where("boards.is_shared = ?", is_shared)
35
- end
36
-
37
- def share(user_ids, new_key)
38
- ActiveRecord::Base.transaction do
39
- user_ids.each do |usr_id|
40
- UserBoard.new({
41
- user_id: usr_id,
42
- board_id: self.board_id,
43
- encrypted_password: nil,
44
- is_admin: false
45
- })
46
- .save!
47
- end
48
- self.board.is_shared = true
49
- self.encrypted_password = new_key
50
- self.save!
51
- end
52
- true
53
-
54
- rescue
55
- self.errors[:base] << "Unable to share the this board"
56
- false
57
- end
58
-
59
- private
60
-
61
- def reset_user_boards_encrypted_password
62
- UserBoard.where("board_id = ? AND user_id != ?", self.board_id, self.user_id).update_all(encrypted_password: nil)
63
- end
64
-
65
- def validate_before_create
66
- if self.board.nil?
67
- b = Board.new(name: @name)
68
- if b.save
69
- self.board_id = b.id
70
- else
71
- self.errors[:base] << "Board name is invalid"
72
- end
73
- end
74
- end
75
-
76
- def validate_before_update
77
- self.board.name = @name if !@name.blank?
78
- reset_user_boards_encrypted_password if self.encrypted_password_changed?
79
- self.errors[:base] << "Board name is invalid" if !self.board.save
80
- end
81
-
82
- end
@@ -1,5 +0,0 @@
1
- class BoardSerializer < ActiveModel::Serializer
2
-
3
- attributes :id, :name, :created_at, :updated_at
4
-
5
- end
@@ -1,23 +0,0 @@
1
- # Serializes the `Post` model instance to json.
2
- # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
-
4
- class PostSerializer < ActiveModel::Serializer
5
-
6
- attributes :id, :title, :content, :created_at, :updated_at
7
-
8
- belongs_to :user
9
-
10
- belongs_to :board do |serializer|
11
- user_board = object.board.user_boards.where(user_id: object.user_id).first
12
-
13
- {
14
- "id" => object.board.id,
15
- "name" => object.board.name,
16
- "is_admin" => user_board.is_admin,
17
- "encrypted_password" => user_board.encrypted_password,
18
- "created_at" => object.board.created_at,
19
- "updated_at" => object.board.updated_at
20
- }
21
- end
22
-
23
- end
@@ -1,11 +0,0 @@
1
- # Serializes the `UserBoard` model instance to json.
2
- # Read more about active model serializers - https://github.com/rails-api/active_model_serializers
3
- #
4
-
5
- class UserBoardSerializer < ActiveModel::Serializer
6
-
7
- attributes :id, :is_admin, :encrypted_password, :created_at, :updated_at
8
-
9
- belongs_to :board
10
-
11
- end
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Welcome to Unsakini</title>
6
- </head>
7
- <body>
8
- <h1>Welcome to Unsakini</h1>
9
- <ul>
10
- <li>
11
- <a href="/app/login">Login</a>
12
- <a href="/app/signup">Sign Up</a>
13
- </li>
14
- </ul>
15
- </body>
16
- </html>
@@ -1,9 +0,0 @@
1
- class CreateBoards < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :boards do |t|
4
- t.text :name
5
-
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,5 +0,0 @@
1
- class AddEncryptedPasswordToUserBoard < ActiveRecord::Migration[5.0]
2
- def change
3
- add_column :user_boards, :encrypted_password, :string
4
- end
5
- end
@@ -1,12 +0,0 @@
1
- class CreateUsers < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :users do |t|
4
- t.string :name
5
- t.string :email
6
- t.string :password_digest
7
- t.boolean :confirmed
8
-
9
- t.timestamps
10
- end
11
- end
12
- end
@@ -1,5 +0,0 @@
1
- class AddIsSharedToBoards < ActiveRecord::Migration[5.0]
2
- def change
3
- add_column :boards, :is_shared, :boolean, default: false
4
- end
5
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- Generates the angular source files
3
-
4
- Example:
5
- rails generate unsakini:angular
6
-
7
- This will create:
8
- angular/ directory in your project root directory
@@ -1,7 +0,0 @@
1
- class Unsakini::AngularGenerator < Rails::Generators::Base
2
- source_root File.expand_path('../../../../../', __FILE__)
3
-
4
- def copy_initializer_file
5
- directory 'angular/dist', 'public/app'
6
- end
7
- end
@@ -1,11 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Version of your assets, change this if you want to expire all your assets.
4
- Rails.application.config.assets.version = '1.0'
5
-
6
- # Add additional assets to the asset load path
7
- # Rails.application.config.assets.paths << Emoji.images_path
8
-
9
- # Precompile additional assets.
10
- # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
11
- # Rails.application.config.assets.precompile += %w( search.js )
@@ -1,5 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Specify a serializer for the signed and encrypted cookie jars.
4
- # Valid options are :json, :marshal, and :hybrid.
5
- Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -1,3 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- Rails.application.config.session_store :cookie_store, key: '_dummy_session'
Binary file
@@ -1,10 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161116114222)
2
- class CreateBoards < ActiveRecord::Migration[5.0]
3
- def change
4
- create_table :boards do |t|
5
- t.text :name
6
-
7
- t.timestamps
8
- end
9
- end
10
- end
@@ -1,12 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161116200034)
2
- class CreateUserBoards < ActiveRecord::Migration[5.0]
3
- def change
4
- create_table :user_boards do |t|
5
- t.integer :user_id
6
- t.integer :board_id
7
- t.boolean :is_admin, :default => false
8
-
9
- t.timestamps
10
- end
11
- end
12
- end
@@ -1,13 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161118031023)
2
- class CreatePosts < ActiveRecord::Migration[5.0]
3
- def change
4
- create_table :posts do |t|
5
- t.text :title
6
- t.text :content
7
- t.integer :user_id
8
- t.integer :board_id
9
-
10
- t.timestamps
11
- end
12
- end
13
- end
@@ -1,12 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161118100454)
2
- class CreateComments < ActiveRecord::Migration[5.0]
3
- def change
4
- create_table :comments do |t|
5
- t.text :content
6
- t.integer :user_id
7
- t.integer :post_id
8
-
9
- t.timestamps
10
- end
11
- end
12
- end
@@ -1,6 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161118221508)
2
- class AddEncryptedPasswordToUserBoard < ActiveRecord::Migration[5.0]
3
- def change
4
- add_column :user_boards, :encrypted_password, :string
5
- end
6
- end
@@ -1,13 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161122211105)
2
- class CreateUsers < ActiveRecord::Migration[5.0]
3
- def change
4
- create_table :users do |t|
5
- t.string :name
6
- t.string :email
7
- t.string :password_digest
8
- t.boolean :confirmed
9
-
10
- t.timestamps
11
- end
12
- end
13
- end
@@ -1,6 +0,0 @@
1
- # This migration comes from unsakini_engine (originally 20161124102633)
2
- class AddIsSharedToBoards < ActiveRecord::Migration[5.0]
3
- def change
4
- add_column :boards, :is_shared, :boolean, default: false
5
- end
6
- end
Binary file