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.
- checksums.yaml +4 -4
- data/README.md +37 -6
- data/angular/angular-cli.json +5 -3
- data/angular/npm-debug.log +54 -0
- data/angular/package.json +4 -1
- data/angular/src/app/app.component.html +1 -4
- data/angular/src/app/app.module.ts +8 -7
- data/angular/src/app/app.routes.module.ts +12 -2
- data/angular/src/app/confirm-account/confirm-account.component.ts +27 -0
- data/angular/src/app/confirm-account/confirm-account.html +41 -0
- data/angular/src/app/confirm-account/confirm-account.module.ts +24 -0
- data/angular/src/app/confirm-account/confirm-account.scss +3 -0
- data/angular/src/app/confirm-account/confirm-account.service.ts +27 -0
- data/angular/src/app/confirm-account/index.ts +3 -0
- data/angular/src/app/index.ts +2 -0
- data/angular/src/app/login/index.ts +3 -0
- data/angular/src/app/login/login.component.ts +40 -0
- data/angular/src/app/login/login.html +43 -0
- data/angular/src/app/login/login.module.ts +27 -0
- data/angular/src/app/login/login.service.ts +48 -0
- data/angular/src/app/registration/index.ts +3 -0
- data/angular/src/app/registration/registration.component.html +70 -12
- data/angular/src/app/registration/registration.component.spec.ts +8 -11
- data/angular/src/app/registration/registration.component.ts +10 -8
- data/angular/src/app/registration/registration.module.ts +23 -0
- data/angular/src/app/registration/registration.service.ts +46 -0
- data/angular/src/app/registration/registration.services.spec.ts +71 -0
- data/angular/src/app/services/auth-http/auth.http.service.ts +35 -0
- data/angular/src/app/services/auth-http/index.ts +1 -0
- data/angular/src/app/services/http/http.service.spec.ts +205 -0
- data/angular/src/app/services/http/http.service.ts +40 -0
- data/angular/src/app/services/http/index.ts +1 -0
- data/angular/src/app/services/index.ts +3 -0
- data/angular/src/app/services/services.module.ts +33 -0
- data/angular/src/assets/global.scss +3 -0
- data/angular/src/environments/custom.ts +4 -0
- data/angular/src/environments/environment.prod.ts +2 -1
- data/angular/src/environments/environment.ts +2 -1
- data/angular/src/index.html +1 -1
- data/app/controllers/application_controller.rb +2 -2
- data/app/controllers/concerns/unsakini/board_owner_controller_concern.rb +42 -0
- data/app/controllers/concerns/unsakini/comment_owner_controller_concern.rb +36 -0
- data/app/controllers/concerns/unsakini/logged_in_controller_concern.rb +23 -0
- data/app/controllers/concerns/unsakini/post_owner_controller_concern.rb +38 -0
- data/app/controllers/concerns/unsakini/serializer_controller_concern.rb +13 -0
- data/app/controllers/unsakini/base_controller.rb +6 -0
- data/app/controllers/unsakini/boards_controller.rb +76 -0
- data/app/controllers/unsakini/comments_controller.rb +54 -0
- data/app/controllers/unsakini/posts_controller.rb +61 -0
- data/app/controllers/unsakini/share_board_controller.rb +122 -0
- data/app/controllers/unsakini/user_token_controller.rb +17 -0
- data/app/controllers/unsakini/users_controller.rb +69 -0
- data/app/controllers/unsakini/web_controller.rb +27 -0
- data/app/mailers/unsakini/user_mailer.rb +13 -0
- data/app/models/concerns/unsakini/encryptable_model_concern.rb +97 -0
- data/app/models/unsakini/application_record.rb +7 -0
- data/app/models/unsakini/board.rb +16 -0
- data/app/models/unsakini/comment.rb +12 -0
- data/app/models/unsakini/post.rb +15 -0
- data/app/models/unsakini/user.rb +43 -0
- data/app/models/unsakini/user_board.rb +84 -0
- data/app/models/unsakini.rb +5 -0
- data/app/serializers/unsakini/board_serializer.rb +7 -0
- data/app/serializers/{comment_serializer.rb → unsakini/comment_serializer.rb} +6 -3
- data/app/serializers/unsakini/post_serializer.rb +26 -0
- data/app/serializers/unsakini/user_board_serializer.rb +14 -0
- data/app/serializers/{user_serializer.rb → unsakini/user_serializer.rb} +5 -2
- data/app/views/unsakini/user_mailer/confirm_account.html.erb +3 -0
- data/app/views/unsakini/web/index.html.erb +343 -0
- data/config/routes.rb +10 -10
- data/db/migrate/20161116114222_create_unsakini_boards.rb +10 -0
- data/db/migrate/{20161116200034_create_user_boards.rb → 20161116200034_create_unsakini_user_boards.rb} +3 -2
- data/db/migrate/{20161118031023_create_posts.rb → 20161118031023_create_unsakini_posts.rb} +2 -2
- data/db/migrate/{20161118100454_create_comments.rb → 20161118100454_create_unsakini_comments.rb} +2 -2
- data/db/migrate/20161126145352_create_unsakini_users.rb +15 -0
- data/lib/generators/unsakini/config/config_generator.rb +3 -1
- data/lib/generators/unsakini/dependencies/USAGE +5 -0
- data/lib/generators/unsakini/dependencies/dependencies_generator.rb +19 -0
- data/lib/tasks/unsakini_tasks.rake +6 -37
- data/lib/unsakini/engine.rb +6 -0
- data/lib/unsakini/version.rb +1 -1
- data/public/css/all.css +1204 -0
- data/public/css/all.css.map +7 -0
- data/public/css/bootstrap.css +5622 -0
- data/public/css/bootstrap.css.map +7 -0
- data/public/css/custom.css +15 -0
- data/public/favicons/android-chrome-144x144.png +0 -0
- data/public/favicons/android-chrome-192x192.png +0 -0
- data/public/favicons/android-chrome-36x36.png +0 -0
- data/public/favicons/android-chrome-48x48.png +0 -0
- data/public/favicons/android-chrome-72x72.png +0 -0
- data/public/favicons/android-chrome-96x96.png +0 -0
- data/public/favicons/apple-touch-icon-114x114.png +0 -0
- data/public/favicons/apple-touch-icon-120x120.png +0 -0
- data/public/favicons/apple-touch-icon-144x144.png +0 -0
- data/public/favicons/apple-touch-icon-152x152.png +0 -0
- data/public/favicons/apple-touch-icon-180x180.png +0 -0
- data/public/favicons/apple-touch-icon-57x57.png +0 -0
- data/public/favicons/apple-touch-icon-60x60.png +0 -0
- data/public/favicons/apple-touch-icon-72x72.png +0 -0
- data/public/favicons/apple-touch-icon-76x76.png +0 -0
- data/public/favicons/apple-touch-icon-precomposed.png +0 -0
- data/public/favicons/apple-touch-icon.png +0 -0
- data/public/favicons/favicon-16x16.png +0 -0
- data/public/favicons/favicon-194x194.png +0 -0
- data/public/favicons/favicon-32x32.png +0 -0
- data/public/favicons/favicon-96x96.png +0 -0
- data/public/favicons/favicon.ico +0 -0
- data/public/favicons/mstile-144x144.png +0 -0
- data/public/favicons/mstile-150x150.png +0 -0
- data/public/favicons/mstile-310x150.png +0 -0
- data/public/favicons/mstile-310x310.png +0 -0
- data/public/favicons/mstile-70x70.png +0 -0
- data/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
- data/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- data/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- data/public/fonts/font-awesome-4.3.0/css/font-awesome.css +1801 -0
- data/public/fonts/font-awesome-4.3.0/css/font-awesome.min.css +4 -0
- data/public/fonts/font-awesome-4.3.0/fonts/FontAwesome.otf +0 -0
- data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.eot +0 -0
- data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.svg +565 -0
- data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf +0 -0
- data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff +0 -0
- data/public/fonts/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 +0 -0
- data/public/images/graph-01.svg +425 -0
- data/public/images/graph-02.svg +435 -0
- data/public/images/graph-03.svg +576 -0
- data/public/images/graph-04.svg +70 -0
- data/public/images/img-01.png +0 -0
- data/public/images/img-decor-01.jpg +0 -0
- data/public/images/img-decor-02.jpg +0 -0
- data/public/images/img-decor-03.jpg +0 -0
- data/public/images/img-social-placeholder-01.png +0 -0
- data/public/images/logo-cb.png +0 -0
- data/public/images/logo-codrops.png +0 -0
- data/public/images/logo-pixel.png +0 -0
- data/public/images/logo-smashing.png +0 -0
- data/public/images/logo-tnw.png +0 -0
- data/public/images/logo-w.png +0 -0
- data/public/images/unsakini.svg +56 -0
- data/public/images/user-01.jpg +0 -0
- data/public/images/user-02.jpg +0 -0
- data/public/images/user-03.jpg +0 -0
- data/public/js/bootstrap.js +2306 -0
- data/public/js/jquery-1.11.2.min.js +4 -0
- data/public/js/jquery.main.js +603 -0
- data/public/manifest.json +41 -0
- data/public/unsakini/app/448c34a56d699c29117adc64c43affeb.woff2 +0 -0
- data/public/unsakini/app/89889688147bd7575d6327160d64e760.svg +288 -0
- data/public/unsakini/app/assets/global.scss +3 -0
- data/public/unsakini/app/e18bbf611f2a2e43afc071aa2f4e1512.ttf +0 -0
- data/public/unsakini/app/f4769f9bdb7466be65088239c12046d1.eot +0 -0
- data/public/unsakini/app/fa2772327f55d8198301fdb8bcfc8158.woff +0 -0
- data/{angular/dist → public/unsakini/app}/favicon.ico +0 -0
- data/public/unsakini/app/index.html +14 -0
- data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.js +2 -0
- data/public/unsakini/app/inline.d41d8cd98f00b204e980.bundle.map +1 -0
- data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js +2152 -0
- data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.js.gz +0 -0
- data/public/unsakini/app/main.54f49c65d3d20650a5d5.bundle.map +1 -0
- data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.js +2 -0
- data/public/unsakini/app/styles.58e065928ed8ebd0b582.bundle.map +1 -0
- data/public/unsakini/app/styles.5dac0e986fce6f8738b300cb558b56a0.bundle.css +8 -0
- data/spec/concerns/models/encryptable_concern.rb +3 -2
- data/spec/controllers/{web_base_controller_spec.rb → web_controller_spec.rb} +5 -4
- data/spec/dummy/config/application.rb +3 -1
- data/spec/dummy/config/environments/development.rb +2 -0
- data/spec/dummy/config/initializers/knock.rb +59 -0
- data/spec/dummy/db/schema.rb +16 -14
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/boards.rb +1 -1
- data/spec/factories/comments.rb +1 -1
- data/spec/factories/posts.rb +1 -1
- data/spec/factories/user_boards.rb +1 -1
- data/spec/factories/users.rb +1 -1
- data/spec/models/board_spec.rb +2 -2
- data/spec/models/comment_spec.rb +2 -2
- data/spec/models/post_spec.rb +2 -2
- data/spec/models/user_board_spec.rb +19 -19
- data/spec/models/user_spec.rb +1 -1
- data/spec/requests/{api/boards/api_boards_crud_spec.rb → boards/boards_crud_spec.rb} +26 -26
- data/spec/requests/{api/boards/api_boards_pagination_spec.rb → boards/boards_pagination_spec.rb} +7 -7
- data/spec/requests/{api/boards/api_private_board_spec.rb → boards/private_board_spec.rb} +26 -26
- data/spec/requests/{api/boards/api_shared_board_spec.rb → boards/shared_board_spec.rb} +9 -9
- data/spec/requests/{api/boards/api_sharing_board_spec.rb → boards/sharing_board_spec.rb} +13 -13
- data/spec/requests/{api/comments/api_comments_pagination_spec.rb → comments/comments_pagination_spec.rb} +3 -3
- data/spec/requests/{api/comments/api_comments_private_board_spec.rb → comments/comments_private_board_spec.rb} +20 -20
- data/spec/requests/{api/comments/api_comments_shared_board_spec.rb → comments/comments_shared_board_spec.rb} +17 -17
- data/spec/requests/{api/posts/api_posts_pagination_spec.rb → posts/posts_pagination_spec.rb} +3 -3
- data/spec/requests/{api/posts/api_posts_private_board_spec.rb → posts/posts_private_board_spec.rb} +22 -22
- data/spec/requests/{api/posts/api_posts_shared_board_spec.rb → posts/posts_shared_board_spec.rb} +24 -24
- data/spec/requests/user/user_create_spec.rb +104 -0
- data/spec/requests/{api/api_users_spec.rb → user/user_search_spec.rb} +9 -9
- data/spec/schema/jwt.json +9 -0
- data/spec/schema/validation_message.json +4 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/auth_helper.rb +0 -2
- metadata +204 -199
- data/angular/dist/index.html +0 -14
- data/angular/dist/inline.bundle.js +0 -139
- data/angular/dist/inline.map +0 -1
- data/angular/dist/main.bundle.js +0 -64689
- data/angular/dist/main.map +0 -1
- data/angular/dist/styles.bundle.js +0 -364
- data/angular/dist/styles.map +0 -1
- data/angular/src/styles.css +0 -1
- data/app/controllers/api/boards_controller.rb +0 -73
- data/app/controllers/api/comments_controller.rb +0 -51
- data/app/controllers/api/posts_controller.rb +0 -58
- data/app/controllers/api/share_board_controller.rb +0 -118
- data/app/controllers/api/users_controller.rb +0 -27
- data/app/controllers/concerns/board_owner_controller_concern.rb +0 -38
- data/app/controllers/concerns/comment_owner_controller_concern.rb +0 -33
- data/app/controllers/concerns/logged_in_controller_concern.rb +0 -21
- data/app/controllers/concerns/post_owner_controller_concern.rb +0 -36
- data/app/controllers/concerns/serializer_controller_concern.rb +0 -11
- data/app/controllers/user_token_controller.rb +0 -2
- data/app/controllers/web_base_controller.rb +0 -15
- data/app/models/application_record.rb +0 -5
- data/app/models/board.rb +0 -14
- data/app/models/comment.rb +0 -9
- data/app/models/concerns/encryptable_model_concern.rb +0 -96
- data/app/models/post.rb +0 -12
- data/app/models/user.rb +0 -6
- data/app/models/user_board.rb +0 -82
- data/app/serializers/board_serializer.rb +0 -5
- data/app/serializers/post_serializer.rb +0 -23
- data/app/serializers/user_board_serializer.rb +0 -11
- data/app/views/web_base/index.html +0 -16
- data/db/migrate/20161116114222_create_boards.rb +0 -9
- data/db/migrate/20161118221508_add_encrypted_password_to_user_board.rb +0 -5
- data/db/migrate/20161122211105_create_users.rb +0 -12
- data/db/migrate/20161124102633_add_is_shared_to_boards.rb +0 -5
- data/lib/generators/unsakini/angular/USAGE +0 -8
- data/lib/generators/unsakini/angular/angular_generator.rb +0 -7
- data/spec/dummy/config/initializers/assets.rb +0 -11
- data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
- data/spec/dummy/config/initializers/session_store.rb +0 -3
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20161124210219_create_boards.unsakini_engine.rb +0 -10
- data/spec/dummy/db/migrate/20161124210220_create_user_boards.unsakini_engine.rb +0 -12
- data/spec/dummy/db/migrate/20161124210221_create_posts.unsakini_engine.rb +0 -13
- data/spec/dummy/db/migrate/20161124210222_create_comments.unsakini_engine.rb +0 -12
- data/spec/dummy/db/migrate/20161124210223_add_encrypted_password_to_user_board.unsakini_engine.rb +0 -6
- data/spec/dummy/db/migrate/20161124210224_create_users.unsakini_engine.rb +0 -13
- data/spec/dummy/db/migrate/20161124210225_add_is_shared_to_boards.unsakini_engine.rb +0 -6
- data/spec/dummy/public/app/favicon.ico +0 -0
- data/spec/dummy/public/app/index.html +0 -14
- data/spec/dummy/public/app/inline.bundle.js +0 -139
- data/spec/dummy/public/app/inline.map +0 -1
- data/spec/dummy/public/app/main.bundle.js +0 -64689
- data/spec/dummy/public/app/main.map +0 -1
- data/spec/dummy/public/app/styles.bundle.js +0 -364
- data/spec/dummy/public/app/styles.map +0 -1
- data/spec/dummy/tmp/unsakini-ng2/LICENSE +0 -21
- data/spec/dummy/tmp/unsakini-ng2/README.md +0 -1
- data/spec/dummy/tmp/unsakini-ng2/angular-cli.json +0 -59
- data/spec/dummy/tmp/unsakini-ng2/e2e/app.e2e-spec.ts +0 -14
- data/spec/dummy/tmp/unsakini-ng2/e2e/app.po.ts +0 -11
- data/spec/dummy/tmp/unsakini-ng2/e2e/signup.e2e-spec.ts +0 -28
- data/spec/dummy/tmp/unsakini-ng2/e2e/signup.po.ts +0 -31
- data/spec/dummy/tmp/unsakini-ng2/e2e/tsconfig.json +0 -16
- data/spec/dummy/tmp/unsakini-ng2/karma.conf.js +0 -45
- data/spec/dummy/tmp/unsakini-ng2/package.json +0 -49
- data/spec/dummy/tmp/unsakini-ng2/protractor.conf.js +0 -32
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.css +0 -0
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.html +0 -4
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.spec.ts +0 -47
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.component.ts +0 -10
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.module.ts +0 -29
- data/spec/dummy/tmp/unsakini-ng2/src/app/app.routes.module.ts +0 -29
- data/spec/dummy/tmp/unsakini-ng2/src/app/index.ts +0 -2
- data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.css +0 -0
- data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.html +0 -14
- data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.spec.ts +0 -157
- data/spec/dummy/tmp/unsakini-ng2/src/app/registration/registration.component.ts +0 -42
- data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.prod.ts +0 -3
- data/spec/dummy/tmp/unsakini-ng2/src/environments/environment.ts +0 -8
- data/spec/dummy/tmp/unsakini-ng2/src/favicon.ico +0 -0
- data/spec/dummy/tmp/unsakini-ng2/src/index.html +0 -14
- data/spec/dummy/tmp/unsakini-ng2/src/main.ts +0 -12
- data/spec/dummy/tmp/unsakini-ng2/src/polyfills.ts +0 -19
- data/spec/dummy/tmp/unsakini-ng2/src/styles.css +0 -1
- data/spec/dummy/tmp/unsakini-ng2/src/test.ts +0 -31
- data/spec/dummy/tmp/unsakini-ng2/src/tsconfig.json +0 -18
- data/spec/dummy/tmp/unsakini-ng2/src/typings.d.ts +0 -2
- data/spec/dummy/tmp/unsakini-ng2/tslint.json +0 -114
- data/spec/dummy/tmp/unsakini-ng2/typings.json +0 -4
@@ -0,0 +1,43 @@
|
|
1
|
+
# module Unsakini
|
2
|
+
module Unsakini
|
3
|
+
class User < ApplicationRecord
|
4
|
+
|
5
|
+
has_secure_password
|
6
|
+
|
7
|
+
validates_uniqueness_of :email, case_sensitive: false, on: [:create]
|
8
|
+
validates_format_of :email, with: /@/
|
9
|
+
validates :name, :email, presence: true
|
10
|
+
validates :password, :presence => true,
|
11
|
+
:confirmation => true,
|
12
|
+
:length => { :minimum => 6 },
|
13
|
+
:if => :password # only validate if password changed!
|
14
|
+
|
15
|
+
has_many :user_boards
|
16
|
+
has_many :boards, through: :user_boards
|
17
|
+
|
18
|
+
before_save :downcase_email
|
19
|
+
before_create :generate_confirmation_instructions
|
20
|
+
|
21
|
+
def downcase_email
|
22
|
+
self.email = self.email.delete(' ').downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_confirmation_instructions
|
26
|
+
self.confirmation_token = SecureRandom.hex(10)
|
27
|
+
self.confirmation_sent_at = Time.now.utc
|
28
|
+
end
|
29
|
+
|
30
|
+
def confirmation_token_valid?
|
31
|
+
(self.confirmation_sent_at + 30.days) > Time.now.utc
|
32
|
+
end
|
33
|
+
|
34
|
+
def mark_as_confirmed!
|
35
|
+
self.confirmation_token = nil
|
36
|
+
self.confirmed_at = Time.now.utc
|
37
|
+
save
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# UserBoard model, links the user and it's boards
|
2
|
+
module Unsakini
|
3
|
+
class UserBoard < ApplicationRecord
|
4
|
+
include EncryptableModelConcern
|
5
|
+
|
6
|
+
encryptable_attributes :encrypted_password
|
7
|
+
|
8
|
+
validates :encrypted_password, :presence => true, if: :is_admin
|
9
|
+
|
10
|
+
before_validation :validate_before_create, on: :create
|
11
|
+
before_validation :validate_before_update, on: :update
|
12
|
+
|
13
|
+
belongs_to :user
|
14
|
+
belongs_to :board
|
15
|
+
|
16
|
+
scope :admin, -> { where(is_admin: true) }
|
17
|
+
|
18
|
+
def name=(str)
|
19
|
+
@name = str
|
20
|
+
end
|
21
|
+
|
22
|
+
def name
|
23
|
+
if !@name.nil?
|
24
|
+
@name
|
25
|
+
else
|
26
|
+
self.board.name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns user_boards where {Board} is `is_shared`
|
31
|
+
#
|
32
|
+
# @param is_shared [Boolean] wether to return shared or not shared boards
|
33
|
+
def self.shared(is_shared)
|
34
|
+
joins("LEFT JOIN #{Board.table_name} ON #{self.table_name}.board_id = #{Board.table_name}.id")
|
35
|
+
.where("#{Board.table_name}.is_shared = ?", is_shared)
|
36
|
+
end
|
37
|
+
|
38
|
+
def share(user_ids, new_key)
|
39
|
+
ActiveRecord::Base.transaction do
|
40
|
+
user_ids.each do |usr_id|
|
41
|
+
UserBoard.new({
|
42
|
+
user_id: usr_id,
|
43
|
+
board_id: self.board_id,
|
44
|
+
encrypted_password: nil,
|
45
|
+
is_admin: false
|
46
|
+
})
|
47
|
+
.save!
|
48
|
+
end
|
49
|
+
self.board.is_shared = true
|
50
|
+
self.encrypted_password = new_key
|
51
|
+
self.save!
|
52
|
+
end
|
53
|
+
true
|
54
|
+
|
55
|
+
rescue
|
56
|
+
self.errors[:base] << "Unable to share the this board"
|
57
|
+
false
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def reset_user_boards_encrypted_password
|
63
|
+
UserBoard.where("board_id = ? AND user_id != ?", self.board_id, self.user_id).update_all(encrypted_password: nil)
|
64
|
+
end
|
65
|
+
|
66
|
+
def validate_before_create
|
67
|
+
if self.board.nil?
|
68
|
+
b = Board.new(name: @name)
|
69
|
+
if b.save
|
70
|
+
self.board_id = b.id
|
71
|
+
else
|
72
|
+
self.errors[:base] << "Board name is invalid"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def validate_before_update
|
78
|
+
self.board.name = @name if !@name.blank?
|
79
|
+
reset_user_boards_encrypted_password if self.encrypted_password_changed?
|
80
|
+
self.errors[:base] << "Board name is invalid" if !self.board.save
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
@@ -1,10 +1,13 @@
|
|
1
1
|
# Serializes the {Comment} model instance to json.
|
2
2
|
# Read more about active model serializers - https://github.com/rails-api/active_model_serializers
|
3
3
|
|
4
|
-
|
4
|
+
module Unsakini
|
5
|
+
class CommentSerializer < ActiveModel::Serializer
|
5
6
|
|
6
|
-
|
7
|
+
attributes :id, :content, :created_at, :updated_at
|
7
8
|
|
8
|
-
|
9
|
+
belongs_to :user
|
10
|
+
|
11
|
+
end
|
9
12
|
|
10
13
|
end
|
@@ -0,0 +1,26 @@
|
|
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
|
+
module Unsakini
|
5
|
+
class PostSerializer < ActiveModel::Serializer
|
6
|
+
|
7
|
+
attributes :id, :title, :content, :created_at, :updated_at
|
8
|
+
|
9
|
+
belongs_to :user
|
10
|
+
|
11
|
+
belongs_to :board do |serializer|
|
12
|
+
user_board = object.board.user_boards.where(user_id: object.user_id).first
|
13
|
+
|
14
|
+
{
|
15
|
+
"id" => object.board.id,
|
16
|
+
"name" => object.board.name,
|
17
|
+
"is_admin" => user_board.is_admin,
|
18
|
+
"encrypted_password" => user_board.encrypted_password,
|
19
|
+
"created_at" => object.board.created_at,
|
20
|
+
"updated_at" => object.board.updated_at
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
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
|
+
module Unsakini
|
6
|
+
class UserBoardSerializer < ActiveModel::Serializer
|
7
|
+
|
8
|
+
attributes :id, :is_admin, :encrypted_password, :created_at, :updated_at
|
9
|
+
|
10
|
+
belongs_to :board
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# Serializes the `User` model instance to json.
|
2
2
|
# Read more about active model serializers - https://github.com/rails-api/active_model_serializers
|
3
3
|
#
|
4
|
-
|
5
|
-
|
4
|
+
module Unsakini
|
5
|
+
class UserSerializer < ActiveModel::Serializer
|
6
|
+
attributes :id, :name, :email, :created_at, :updated_at
|
7
|
+
end
|
8
|
+
|
6
9
|
end
|
@@ -0,0 +1,343 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title><%= @title %></title>
|
7
|
+
<meta name="description" content="<%= @description %>">
|
8
|
+
<meta name="keywords" content="<%= @keywords %>">
|
9
|
+
<meta name="author" content="<%= @author %>">
|
10
|
+
<link rel="apple-touch-icon" sizes="57x57" href="favicons/apple-touch-icon-57x57.png">
|
11
|
+
<link rel="apple-touch-icon" sizes="60x60" href="favicons/apple-touch-icon-60x60.png">
|
12
|
+
<link rel="apple-touch-icon" sizes="72x72" href="favicons/apple-touch-icon-72x72.png">
|
13
|
+
<link rel="apple-touch-icon" sizes="76x76" href="favicons/apple-touch-icon-76x76.png">
|
14
|
+
<link rel="apple-touch-icon" sizes="114x114" href="favicons/apple-touch-icon-114x114.png">
|
15
|
+
<link rel="apple-touch-icon" sizes="120x120" href="favicons/apple-touch-icon-120x120.png">
|
16
|
+
<link rel="apple-touch-icon" sizes="144x144" href="favicons/apple-touch-icon-144x144.png">
|
17
|
+
<link rel="apple-touch-icon" sizes="152x152" href="favicons/apple-touch-icon-152x152.png">
|
18
|
+
<link rel="apple-touch-icon" sizes="180x180" href="favicons/apple-touch-icon-180x180.png">
|
19
|
+
<link rel="icon" type="image/png" href="favicons/favicon-32x32.png" sizes="32x32">
|
20
|
+
<link rel="icon" type="image/png" href="favicons/favicon-194x194.png" sizes="194x194">
|
21
|
+
<link rel="icon" type="image/png" href="favicons/favicon-96x96.png" sizes="96x96">
|
22
|
+
<link rel="icon" type="image/png" href="favicons/android-chrome-192x192.png" sizes="192x192">
|
23
|
+
<link rel="icon" type="image/png" href="favicons/favicon-16x16.png" sizes="16x16">
|
24
|
+
<link rel="manifest" href="favicons/manifest.json">
|
25
|
+
<link rel="shortcut icon" href="favicons/favicon.ico">
|
26
|
+
<meta name="msapplication-TileColor" content="#603cba">
|
27
|
+
<meta name="msapplication-TileImage" content="favicons/mstile-144x144.png">
|
28
|
+
<meta name="msapplication-config" content="favicons/browserconfig.xml">
|
29
|
+
<meta name="theme-color" content="#ffffff">
|
30
|
+
<link rel="stylesheet" href="css/bootstrap.css">
|
31
|
+
<link rel="stylesheet" href="fonts/font-awesome-4.3.0/css/font-awesome.min.css">
|
32
|
+
<link rel="stylesheet" href="css/all.css">
|
33
|
+
<link rel="stylesheet" href="css/custom.css">
|
34
|
+
<link href='http://fonts.googleapis.com/css?family=Montserrat:400,700|Source+Sans+Pro:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
|
35
|
+
</head>
|
36
|
+
<body>
|
37
|
+
<div id="wrapper">
|
38
|
+
<header id="header">
|
39
|
+
<div class="container">
|
40
|
+
<div class="logo"><a href="#">
|
41
|
+
<img src="images/unsakini.svg" width="150px" height="40px" alt="Unsakini">
|
42
|
+
<!-- UNSAKINI -->
|
43
|
+
</a></div>
|
44
|
+
<nav id="nav">
|
45
|
+
<div class="opener-holder">
|
46
|
+
<a href="#" class="nav-opener"><span></span></a>
|
47
|
+
</div>
|
48
|
+
<a href="/unsakini/app/signup" class="btn btn-primary rounded visible-md visible-lg">
|
49
|
+
Create Account
|
50
|
+
</a>
|
51
|
+
<div class="nav-drop">
|
52
|
+
<ul>
|
53
|
+
<li class="active visible-sm visible-xs"><a href="/">Home</a></li>
|
54
|
+
<li><a href="#">Documentation</a></li>
|
55
|
+
<li><a href="#">Blog</a></li>
|
56
|
+
<li class="hidden-xs hidden-sm">|</li>
|
57
|
+
<li><a href="/unsakini/app/login">Login</a></li>
|
58
|
+
<li><a href="/unsakini/app/signup" class="hidden-md hidden-lg">Create Account</a></li>
|
59
|
+
</ul>
|
60
|
+
<!-- <div class="drop-holder visible-sm visible-xs">
|
61
|
+
<span>Follow Us</span>
|
62
|
+
<ul class="social-networks">
|
63
|
+
<li><a class="fa fa-github" href="#"></a></li>
|
64
|
+
<li><a class="fa fa-twitter" href="#"></a></li>
|
65
|
+
<li><a class="fa fa-facebook" href="#"></a></li>
|
66
|
+
</ul>
|
67
|
+
</div> -->
|
68
|
+
</div>
|
69
|
+
</nav>
|
70
|
+
</div>
|
71
|
+
</header>
|
72
|
+
<section class="visual">
|
73
|
+
<div class="container">
|
74
|
+
<div class="text-block">
|
75
|
+
<div class="heading-holder">
|
76
|
+
<h1>Welcome home, mavericks</h1>
|
77
|
+
</div>
|
78
|
+
<p class="tagline"><%= @description %></p>
|
79
|
+
<span class="info">Version <%= @version %></span>
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
<img src="images/img-decor-01.jpg" alt="" class="bg-stretch">
|
83
|
+
</section>
|
84
|
+
<section class="main">
|
85
|
+
<div class="container">
|
86
|
+
<div id="cta">
|
87
|
+
<a href="<%= @repository %>" class="btn btn-primary rounded">
|
88
|
+
Deploy to Your Server
|
89
|
+
</a>
|
90
|
+
<p>Released under MIT License</p>
|
91
|
+
</div>
|
92
|
+
<div class="row">
|
93
|
+
<div class="text-box col-md-offset-1 col-md-10">
|
94
|
+
<h2>Conquer the world with confidence</h2>
|
95
|
+
<p>
|
96
|
+
<strong><a href="https://www.unsakini.com">Unsakini</a></strong> is an open source encrypted bulletin board created with the aim of evading global information surveillance and spying, preventing data leaks and promoting information confidentiality and integrity.
|
97
|
+
</p>
|
98
|
+
<p>
|
99
|
+
The internet is monitored. They hear what we say, but they won't know what we mean.
|
100
|
+
</p>
|
101
|
+
</div>
|
102
|
+
</div>
|
103
|
+
</div>
|
104
|
+
</section>
|
105
|
+
<section class="area">
|
106
|
+
<div class="container">
|
107
|
+
<div class="row">
|
108
|
+
<div class="col-md-5">
|
109
|
+
<h2 class="visible-xs visible-sm text-primary">Features</h2>
|
110
|
+
<ul class="visual-list">
|
111
|
+
<li>
|
112
|
+
<div class="img-holder">
|
113
|
+
<img src="images/graph-04.svg" width="110" alt="">
|
114
|
+
</div>
|
115
|
+
<div class="text-holder">
|
116
|
+
<h3>Protected Discussion Boards</h3>
|
117
|
+
<p>
|
118
|
+
Create a board. Protect it with an secret key then share it. Others won't be able to open the board without the secret key used to protect the
|
119
|
+
board. Only you and the people you share the secret key will be able to
|
120
|
+
participate in the board.
|
121
|
+
</p>
|
122
|
+
</div>
|
123
|
+
</li>
|
124
|
+
<li>
|
125
|
+
<div class="img-holder">
|
126
|
+
<img class="pull-left" src="images/graph-03.svg" width="90" alt="">
|
127
|
+
</div>
|
128
|
+
<div class="text-holder">
|
129
|
+
<h3>Encrypted File Uploads</h3>
|
130
|
+
<p>
|
131
|
+
All Files Uploaded are encrypted the same way your other data are encrypted.
|
132
|
+
Only you can access your files and the ones you share it with.
|
133
|
+
</p>
|
134
|
+
</div>
|
135
|
+
</li>
|
136
|
+
<li>
|
137
|
+
<div class="img-holder">
|
138
|
+
<img src="images/graph-02.svg" height="84" alt="">
|
139
|
+
</div>
|
140
|
+
<div class="text-holder">
|
141
|
+
<h3>Encrypted Chat Convo</h3>
|
142
|
+
<p>
|
143
|
+
All conversations are encrypted. Only you and the one you converse with
|
144
|
+
can be able to open the chat history. Once you forgot your password for a
|
145
|
+
certain thread, you can always start a new one with a new secret key.
|
146
|
+
</p>
|
147
|
+
</div>
|
148
|
+
</li>
|
149
|
+
<li>
|
150
|
+
<div class="img-holder">
|
151
|
+
<img src="images/graph-04.svg" height="84" alt="">
|
152
|
+
</div>
|
153
|
+
<div class="text-holder">
|
154
|
+
<h3>Modern UI</h3>
|
155
|
+
<p>
|
156
|
+
Pleasing, easy to use software. Using modern web design trends and tools in developing the UI for
|
157
|
+
better user experience.
|
158
|
+
</p>
|
159
|
+
</div>
|
160
|
+
</li>
|
161
|
+
</ul>
|
162
|
+
</div>
|
163
|
+
<div class="col-md-7">
|
164
|
+
<div class="slide-holder">
|
165
|
+
<h2 class="hidden-xs hidden-sm text-primary">Features</h2>
|
166
|
+
<div class="img-slide scroll-trigger"><img src="images/img-01.png" height="624" width="1184" alt=""></div>
|
167
|
+
</div>
|
168
|
+
</div>
|
169
|
+
</div>
|
170
|
+
</div>
|
171
|
+
</section>
|
172
|
+
<section class="main content-area">
|
173
|
+
<div class="container">
|
174
|
+
<div class="row">
|
175
|
+
<div class="text-box col-md-10 col-md-offset-1">
|
176
|
+
<h2>How it Works</h2>
|
177
|
+
<p>Upon using the system, you'll be asked to provide your private key. This key is used to encrypt your data before they are sent to the server. The key is stored in your computer and is never sent to the server.</p>
|
178
|
+
|
179
|
+
<p>Hackers, surveillance and spy softwares and even the server host cannot read your data, unless they are able to obtain your private key. Your private key is deleted from your computer everytime you logout to ensure no one can obtain it while you're away.</p>
|
180
|
+
|
181
|
+
<p>To increase the security, your data is re-encrypted in the backend before being saved to the database, which adds a second layer of protection.</p>
|
182
|
+
|
183
|
+
<p>So to access your data, the hacker (or spyware) needs to know two things - (1) your private key and (2) the server encryption key. That is, if they are able to bypass the server security and gets access to the database. Even so, they won't be able to read the data without these two elements.</p>
|
184
|
+
|
185
|
+
<p>The data is ecnrypted using <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">Advanced Encryption System (AES)</a>, the most widely used and trusted encryption algorithm.</p>
|
186
|
+
</div>
|
187
|
+
</div>
|
188
|
+
</div>
|
189
|
+
</section>
|
190
|
+
|
191
|
+
|
192
|
+
<section class="area">
|
193
|
+
<div class="container">
|
194
|
+
<h2 class="text-center">
|
195
|
+
Deployment Options
|
196
|
+
</h2>
|
197
|
+
<div class="row">
|
198
|
+
<div class="col-md-6 text-box">
|
199
|
+
<h3 class="text-left">Full Stack</h3>
|
200
|
+
<p class="text-left">
|
201
|
+
Unsakini can be deployed as a full stack rails application. It can be integrated into your
|
202
|
+
existing rails 5 application, or you can create a new one. This application you are using is
|
203
|
+
an example of a full-stack Unsakini installation. But there are things you need to configure
|
204
|
+
before you can fully deploy this on your server like the mailer configuration and database
|
205
|
+
connection.
|
206
|
+
</p>
|
207
|
+
<p class="text-left">
|
208
|
+
<a href="#"><b>Read more</b></a>
|
209
|
+
</p>
|
210
|
+
</div>
|
211
|
+
<div class="col-md-6 text-box">
|
212
|
+
<h3 class="text-left">Client-Only</h3>
|
213
|
+
<p class="text-left">
|
214
|
+
Instead of going through the hassle of configuring a full-stack rails application, get only the vanilla HTML, CSS and JS files and upload it to your prefered server. Static files are easier to deploy since you just need a server capable of hosting static files.
|
215
|
+
</p>
|
216
|
+
<!-- <p class="text-left">
|
217
|
+
You can get the files of Unsakini client application from my Github <a href="https://github.com/adonespitogo/unsakini/angular">repository</a>. By default, it will use the existing API at <a href="https://www.unsakini.com">Unsakini.com</a>.
|
218
|
+
</p>
|
219
|
+
<p class="text-left">
|
220
|
+
If you want to use a different server, you need <a href="https://nodejs.org/en/">Node.js</a> with <a href="https://github.com/angular/angular-cli">Angular CLI</a> to build the source code. Configure the javascript application to use any other existing Unsakini full-stack deployed app. Lastly, upload it to your server.
|
221
|
+
</p> -->
|
222
|
+
<p class="text-left"><a href="#"><b>Read more</b></a></p>
|
223
|
+
</div>
|
224
|
+
</div>
|
225
|
+
</div>
|
226
|
+
</section>
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
<!-- <section class="area">
|
231
|
+
<div class="container">
|
232
|
+
<div class="subscribe">
|
233
|
+
<h3>Subscribe to Our Newsletter</h3>
|
234
|
+
<form class="form-inline">
|
235
|
+
<button type="submit" class="btn btn-primary rounded">Subscribe</button>
|
236
|
+
<div class="form-group">
|
237
|
+
<input type="email" class="form-control rounded" id="exampleInputEmail2" placeholder="Email...">
|
238
|
+
</div>
|
239
|
+
</form>
|
240
|
+
</div>
|
241
|
+
</div>
|
242
|
+
</section>
|
243
|
+
<section class="main">
|
244
|
+
<div class="container">
|
245
|
+
<div class="content">
|
246
|
+
<div class="row">
|
247
|
+
<div class="col-md-4">
|
248
|
+
<h3>New in Release 2.8</h3>
|
249
|
+
<h4>Fully Available: Live Preview Support for Multiple Browsers</h4>
|
250
|
+
<p>Morbi faucibus ante ipsum, a tincidunt libero posuere et. Etiam tempor tortor at odio condimentum, sit amet fringilla ligula maximus. Mauris venenatis nisl nisi, et dictum dui aliquet nec. Sed erat, nec aliquam vel, aliquam ac felis. </p>
|
251
|
+
<h4>Improved Support for Typing </h4>
|
252
|
+
<p>Nulla purus quam, pulvinar sed ante et, feugiat maximus velit. Donec eu elit mauris. </p>
|
253
|
+
<h4>Improved Stability</h4>
|
254
|
+
<p>Proin id ligula eget massa tincidunt molestie. Morbi urna lectus, molestie vel quam vel, iaculis fermentum nunc. Morbi imperdiet, leo in interdum pretium.</p>
|
255
|
+
<div class="btn-holder">
|
256
|
+
<a href="#" class="btn btn-link">Go to Release Log</a>
|
257
|
+
</div>
|
258
|
+
</div>
|
259
|
+
<div class="col-md-4">
|
260
|
+
<h3>Popular Extensions</h3>
|
261
|
+
<h4><a href="#">Custom Themes 1.1</a></h4>
|
262
|
+
<p>Etiam viverra vulputate diam, pulvinar cursus augue egestas ullamcorper. </p>
|
263
|
+
<h4><a href="#">Filter Forge</a></h4>
|
264
|
+
<p>Nulla purus quam, pulvinar sed et, feugiat maximus velit.</p>
|
265
|
+
<h4><a href="#">WebZap</a></h4>
|
266
|
+
<p>Morbi imperdiet, leo in interdum pretium, elit eros dapibus velit, eu posuere quam diam vitae orci. Suspendisse interdum accumsan magna vitae commodo.</p>
|
267
|
+
<h4><a href="#">Renamy</a></h4>
|
268
|
+
<p>Vivamus consectetur suscipit elit, ut lacinia diam elementum et.</p>
|
269
|
+
<div class="btn-holder">
|
270
|
+
<a href="#" class="btn btn-link">Go to Marketplace</a>
|
271
|
+
</div>
|
272
|
+
</div>
|
273
|
+
<div class="col-md-4">
|
274
|
+
<h3>New From the Blog</h3>
|
275
|
+
<h4><a href="#">Morbi imperdiet, leo in interdum pretium.</a></h4>
|
276
|
+
<time class="date" datetime="2015-02-18">February 18, 2015</time>
|
277
|
+
<h4><a href="#">Donec orci ante, porta vel nulla quis, aliquet hendrerit leo.</a></h4>
|
278
|
+
<time class="date" datetime="2015-02-12">February 12, 2015</time>
|
279
|
+
<h4><a href="#">Suspendisse egestas vulputate luctus.</a></h4>
|
280
|
+
<time class="date" datetime="2015-02-06">February 6, 2015</time>
|
281
|
+
<h4><a href="#">Quisque varius ante lorem, eget pretium purus hendrerit a egestas. </a></h4>
|
282
|
+
<time class="date" datetime="2015-02-02">February 2, 2015</time>
|
283
|
+
<h4><a href="#">Phasellus in augue risus. </a></h4>
|
284
|
+
<time class="date" datetime="2015-01-23">January 23, 2015</time>
|
285
|
+
<div class="btn-holder">
|
286
|
+
<a href="#" class="btn btn-link">Go to Blog</a>
|
287
|
+
</div>
|
288
|
+
</div>
|
289
|
+
</div>
|
290
|
+
</div>
|
291
|
+
</div>
|
292
|
+
</section> -->
|
293
|
+
<footer id="footer">
|
294
|
+
<div class="container">
|
295
|
+
<div class="footer-holder">
|
296
|
+
<div class="row">
|
297
|
+
<div class="col-md-4">
|
298
|
+
<div class="logo"><a href="#"><img src="images/unsakini.svg" alt="FORKIO"></a></div>
|
299
|
+
<p>
|
300
|
+
<%= @tagline %>
|
301
|
+
</p>
|
302
|
+
</div>
|
303
|
+
<div class="col-md-2">
|
304
|
+
<h4>Links</h4>
|
305
|
+
<ul>
|
306
|
+
<li><a href="http://www.unsakini.com">Project Website</a></li>
|
307
|
+
<li><a href="/">Documentation</a></li>
|
308
|
+
</ul>
|
309
|
+
</div>
|
310
|
+
<div class="col-md-3">
|
311
|
+
<h4>About the Author</h4>
|
312
|
+
<ul>
|
313
|
+
<li><a href="http://adonespitogo.com">adonespitogo.com</a></li>
|
314
|
+
<li><a href="https://github.com/adonespitogo">github.com/adonespitogo</a></li>
|
315
|
+
<li><a href="mailto:pitogo.adones@gmail.com">pitogo.adones@gmail.com</a></li>
|
316
|
+
</ul>
|
317
|
+
</div>
|
318
|
+
<!-- <div class="col-md-3">
|
319
|
+
<div class="text-holder">
|
320
|
+
<strong class="phone"><a href="tel:3475677890">347 567 78 90</a></strong>
|
321
|
+
<span class="available">Available from 12PM - 18PM</span>
|
322
|
+
<h4>New York, NY</h4>
|
323
|
+
<address>560 Judah St & 15th Ave, Apt 5 San Francisco, CA, 230903</address>
|
324
|
+
</div>
|
325
|
+
</div> -->
|
326
|
+
<div class="col-md-3">
|
327
|
+
<div class="text-frame">
|
328
|
+
<h4>Credits</h4>
|
329
|
+
<p>
|
330
|
+
This awesome <a href="http://tympanus.net/codrops/2015/03/12/freebie-forkio-one-page-website-template/">template</a> is made by the folks from <a href="https://pixelbuddha.net/"><strong>Pixel Buddha</strong></a> and <a href="https://www.psd2html.com/"><strong>PSD2HTML</strong></a>. The elegant one-page design is perfect for web dev, apps or software related projects.
|
331
|
+
</p>
|
332
|
+
</div>
|
333
|
+
</div>
|
334
|
+
</div>
|
335
|
+
</div>
|
336
|
+
</div>
|
337
|
+
</footer>
|
338
|
+
</div>
|
339
|
+
<script src="js/jquery-1.11.2.min.js"></script>
|
340
|
+
<script src="js/bootstrap.js"></script>
|
341
|
+
<script src="js/jquery.main.js"></script>
|
342
|
+
</body>
|
343
|
+
</html>
|
data/config/routes.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
-
|
3
|
-
root to: 'web_base#index'
|
4
2
|
|
5
|
-
|
3
|
+
root to: 'unsakini/web#index'
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
namespace :unsakini do
|
6
|
+
#knock route
|
7
|
+
post 'user_token' => 'user_token#create'
|
8
|
+
# ng2 html5 pushState routes
|
9
|
+
get 'app', to: 'web#app'
|
10
|
+
get 'app/*ngroute', to: 'web#app'
|
10
11
|
|
11
|
-
namespace :api do
|
12
12
|
resource :user
|
13
13
|
resources :boards do
|
14
14
|
resources :posts do
|
@@ -16,9 +16,9 @@ Rails.application.routes.draw do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
post '
|
20
|
-
get '
|
21
|
-
|
19
|
+
post 'share/board/', to: 'share_board#index', as: 'share_board'
|
20
|
+
get 'users/search', to: 'users#search', as: 'user_search'
|
21
|
+
get 'user/confirm/:token', to: 'users#confirm', as: 'confirm_account'
|
22
22
|
|
23
23
|
end
|
24
24
|
|
@@ -1,8 +1,9 @@
|
|
1
|
-
class
|
1
|
+
class CreateUnsakiniUserBoards < ActiveRecord::Migration[5.0]
|
2
2
|
def change
|
3
|
-
create_table :
|
3
|
+
create_table :unsakini_user_boards do |t|
|
4
4
|
t.integer :user_id
|
5
5
|
t.integer :board_id
|
6
|
+
t.string :encrypted_password
|
6
7
|
t.boolean :is_admin, :default => false
|
7
8
|
|
8
9
|
t.timestamps
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateUnsakiniUsers < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :unsakini_users do |t|
|
4
|
+
t.string :name, null: false
|
5
|
+
t.string :email, null: false
|
6
|
+
t.string :password_digest, null: false
|
7
|
+
t.string :confirmation_token
|
8
|
+
t.datetime :confirmed_at
|
9
|
+
t.datetime :confirmation_sent_at
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|