amazon-chime-sdk-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +87 -0
- data/.rspec +2 -0
- data/.travis.yml +47 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +25 -0
- data/LICENSE +21 -0
- data/README.md +1109 -0
- data/Rakefile +20 -0
- data/amazon-chime-sdk-rails.gemspec +29 -0
- data/gemfiles/Gemfile.rails-5.0 +25 -0
- data/gemfiles/Gemfile.rails-5.1 +25 -0
- data/gemfiles/Gemfile.rails-5.2 +25 -0
- data/gemfiles/Gemfile.rails-6.0 +25 -0
- data/lib/amazon-chime-sdk-rails.rb +37 -0
- data/lib/chime_sdk/config.rb +90 -0
- data/lib/chime_sdk/controller/attendees.rb +128 -0
- data/lib/chime_sdk/controller/common.rb +202 -0
- data/lib/chime_sdk/controller/meetings.rb +192 -0
- data/lib/chime_sdk/meeting_coordinator.rb +184 -0
- data/lib/chime_sdk/version.rb +4 -0
- data/lib/generators/chime_sdk/controllers_generator.rb +104 -0
- data/lib/generators/chime_sdk/install_generator.rb +27 -0
- data/lib/generators/chime_sdk/js_generator.rb +67 -0
- data/lib/generators/chime_sdk/views_generator.rb +43 -0
- data/lib/generators/templates/chime_sdk.rb +28 -0
- data/lib/generators/templates/controllers/README +35 -0
- data/lib/generators/templates/controllers/meeting_attendees_controller.rb +106 -0
- data/lib/generators/templates/controllers/meetings_controller.rb +146 -0
- data/lib/generators/templates/views/meetings/index.html.erb +27 -0
- data/lib/generators/templates/views/meetings/show.html.erb +136 -0
- data/spec/factories/rooms.rb +5 -0
- data/spec/factories/users.rb +8 -0
- data/spec/generators/controllers_generator_spec.rb +113 -0
- data/spec/generators/install_generator_spec.rb +24 -0
- data/spec/generators/js_generator_spec.rb +26 -0
- data/spec/generators/views_generator_spec.rb +46 -0
- data/spec/rails_app/Rakefile +15 -0
- data/spec/rails_app/app/assets/config/manifest.js +2 -0
- data/spec/rails_app/app/assets/images/.keep +0 -0
- data/spec/rails_app/app/assets/javascripts/.keep +0 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +15 -0
- data/spec/rails_app/app/assets/stylesheets/scaffolds.scss +65 -0
- data/spec/rails_app/app/controllers/api/meeting_attendees_controller.rb +3 -0
- data/spec/rails_app/app/controllers/api/meetings_controller.rb +3 -0
- data/spec/rails_app/app/controllers/api/rooms_controller.rb +3 -0
- data/spec/rails_app/app/controllers/application_controller.rb +11 -0
- data/spec/rails_app/app/controllers/entries_controller.rb +47 -0
- data/spec/rails_app/app/controllers/meeting_attendees_controller.rb +121 -0
- data/spec/rails_app/app/controllers/meetings_controller.rb +162 -0
- data/spec/rails_app/app/controllers/rooms_controller.rb +76 -0
- data/spec/rails_app/app/controllers/spa_controller.rb +6 -0
- data/spec/rails_app/app/javascript/App.vue +50 -0
- data/spec/rails_app/app/javascript/channels/consumer.js +6 -0
- data/spec/rails_app/app/javascript/channels/index.js +5 -0
- data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +84 -0
- data/spec/rails_app/app/javascript/components/meetings/Index.vue +100 -0
- data/spec/rails_app/app/javascript/components/meetings/Meeting.vue +178 -0
- data/spec/rails_app/app/javascript/components/rooms/Index.vue +53 -0
- data/spec/rails_app/app/javascript/components/rooms/Show.vue +91 -0
- data/spec/rails_app/app/javascript/packs/application.js +17 -0
- data/spec/rails_app/app/javascript/packs/spa.js +14 -0
- data/spec/rails_app/app/javascript/router/index.js +74 -0
- data/spec/rails_app/app/javascript/store/index.js +37 -0
- data/spec/rails_app/app/models/application_record.rb +3 -0
- data/spec/rails_app/app/models/entry.rb +5 -0
- data/spec/rails_app/app/models/room.rb +12 -0
- data/spec/rails_app/app/models/user.rb +6 -0
- data/spec/rails_app/app/views/devise/registrations/new.html.erb +34 -0
- data/spec/rails_app/app/views/layouts/_header.html.erb +20 -0
- data/spec/rails_app/app/views/layouts/application.html.erb +18 -0
- data/spec/rails_app/app/views/meetings/index.html.erb +28 -0
- data/spec/rails_app/app/views/meetings/show.html.erb +136 -0
- data/spec/rails_app/app/views/rooms/_form.html.erb +22 -0
- data/spec/rails_app/app/views/rooms/_room.json.jbuilder +7 -0
- data/spec/rails_app/app/views/rooms/edit.html.erb +6 -0
- data/spec/rails_app/app/views/rooms/index.html.erb +27 -0
- data/spec/rails_app/app/views/rooms/index.json.jbuilder +1 -0
- data/spec/rails_app/app/views/rooms/new.html.erb +5 -0
- data/spec/rails_app/app/views/rooms/show.html.erb +42 -0
- data/spec/rails_app/app/views/rooms/show.json.jbuilder +1 -0
- data/spec/rails_app/app/views/spa/index.html.erb +1 -0
- data/spec/rails_app/babel.config.js +72 -0
- data/spec/rails_app/bin/bundle +114 -0
- data/spec/rails_app/bin/rails +9 -0
- data/spec/rails_app/bin/rake +9 -0
- data/spec/rails_app/bin/setup +36 -0
- data/spec/rails_app/bin/spring +17 -0
- data/spec/rails_app/bin/webpack +18 -0
- data/spec/rails_app/bin/webpack-dev-server +18 -0
- data/spec/rails_app/bin/yarn +11 -0
- data/spec/rails_app/config.ru +5 -0
- data/spec/rails_app/config/application.rb +21 -0
- data/spec/rails_app/config/boot.rb +4 -0
- data/spec/rails_app/config/cable.yml +10 -0
- data/spec/rails_app/config/credentials.yml.enc +1 -0
- data/spec/rails_app/config/database.yml +25 -0
- data/spec/rails_app/config/environment.rb +14 -0
- data/spec/rails_app/config/environments/development.rb +62 -0
- data/spec/rails_app/config/environments/production.rb +112 -0
- data/spec/rails_app/config/environments/test.rb +49 -0
- data/spec/rails_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/rails_app/config/initializers/assets.rb +15 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/chime_sdk.rb +28 -0
- data/spec/rails_app/config/initializers/content_security_policy.rb +30 -0
- data/spec/rails_app/config/initializers/cookies_serializer.rb +5 -0
- data/spec/rails_app/config/initializers/devise.rb +311 -0
- data/spec/rails_app/config/initializers/devise_token_auth.rb +60 -0
- data/spec/rails_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/rails_app/config/initializers/inflections.rb +16 -0
- data/spec/rails_app/config/initializers/mime_types.rb +4 -0
- data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails_app/config/locales/devise.en.yml +65 -0
- data/spec/rails_app/config/locales/en.yml +33 -0
- data/spec/rails_app/config/puma.rb +38 -0
- data/spec/rails_app/config/routes.rb +24 -0
- data/spec/rails_app/config/secrets.yml +8 -0
- data/spec/rails_app/config/spring.rb +6 -0
- data/spec/rails_app/config/storage.yml +34 -0
- data/spec/rails_app/config/webpack/development.js +5 -0
- data/spec/rails_app/config/webpack/environment.js +7 -0
- data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
- data/spec/rails_app/config/webpack/production.js +5 -0
- data/spec/rails_app/config/webpack/test.js +5 -0
- data/spec/rails_app/config/webpacker.yml +97 -0
- data/spec/rails_app/db/migrate/20200912140231_devise_create_users.rb +45 -0
- data/spec/rails_app/db/migrate/20200912140352_add_tokens_to_users.rb +12 -0
- data/spec/rails_app/db/migrate/20200912140657_create_rooms.rb +9 -0
- data/spec/rails_app/db/migrate/20200912140749_create_entries.rb +10 -0
- data/spec/rails_app/db/schema.rb +49 -0
- data/spec/rails_app/db/seeds.rb +41 -0
- data/spec/rails_app/log/.keep +0 -0
- data/spec/rails_app/package.json +23 -0
- data/spec/rails_app/postcss.config.js +12 -0
- data/spec/rails_app/public/404.html +67 -0
- data/spec/rails_app/public/422.html +67 -0
- data/spec/rails_app/public/500.html +66 -0
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/robots.txt +1 -0
- data/spec/rails_app/tmp/.keep +0 -0
- data/spec/requests/atendees_spec.rb +182 -0
- data/spec/requests/meetings_spec.rb +433 -0
- data/spec/spec_helper.rb +35 -0
- metadata +400 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
create_table :users do |t|
|
6
|
+
## Database authenticatable
|
7
|
+
t.string :email, null: false, default: ""
|
8
|
+
t.string :encrypted_password, null: false, default: ""
|
9
|
+
|
10
|
+
## Recoverable
|
11
|
+
t.string :reset_password_token
|
12
|
+
t.datetime :reset_password_sent_at
|
13
|
+
|
14
|
+
## Rememberable
|
15
|
+
t.datetime :remember_created_at
|
16
|
+
|
17
|
+
## Trackable
|
18
|
+
# t.integer :sign_in_count, default: 0, null: false
|
19
|
+
# t.datetime :current_sign_in_at
|
20
|
+
# t.datetime :last_sign_in_at
|
21
|
+
# t.string :current_sign_in_ip
|
22
|
+
# t.string :last_sign_in_ip
|
23
|
+
|
24
|
+
## Confirmable
|
25
|
+
# t.string :confirmation_token
|
26
|
+
# t.datetime :confirmed_at
|
27
|
+
# t.datetime :confirmation_sent_at
|
28
|
+
# t.string :unconfirmed_email # Only if using reconfirmable
|
29
|
+
|
30
|
+
## Lockable
|
31
|
+
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
32
|
+
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
33
|
+
# t.datetime :locked_at
|
34
|
+
|
35
|
+
t.string :name
|
36
|
+
|
37
|
+
t.timestamps null: false
|
38
|
+
end
|
39
|
+
|
40
|
+
add_index :users, :email, unique: true
|
41
|
+
add_index :users, :reset_password_token, unique: true
|
42
|
+
# add_index :users, :confirmation_token, unique: true
|
43
|
+
# add_index :users, :unlock_token, unique: true
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class AddTokensToUsers < ActiveRecord::Migration[6.0]
|
2
|
+
def change
|
3
|
+
## Required
|
4
|
+
add_column :users, :provider, :string, null: false, default: "email"
|
5
|
+
add_column :users, :uid, :string, null: false, default: ""
|
6
|
+
|
7
|
+
## Tokens
|
8
|
+
add_column :users, :tokens, :text
|
9
|
+
|
10
|
+
add_index :users, [:uid, :provider], unique: true
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead
|
2
|
+
# of editing this file, please use the migrations feature of Active Record to
|
3
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# This file is the source Rails uses to define your schema when running `rails
|
6
|
+
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
|
7
|
+
# be faster and is potentially less error prone than running all of your
|
8
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
9
|
+
# migrations use external dependencies or application code.
|
10
|
+
#
|
11
|
+
# It's strongly recommended that you check this file into your version control system.
|
12
|
+
|
13
|
+
ActiveRecord::Schema.define(version: 2020_09_12_140749) do
|
14
|
+
|
15
|
+
create_table "entries", force: :cascade do |t|
|
16
|
+
t.integer "room_id", null: false
|
17
|
+
t.integer "user_id", null: false
|
18
|
+
t.datetime "created_at", precision: 6, null: false
|
19
|
+
t.datetime "updated_at", precision: 6, null: false
|
20
|
+
t.index ["room_id"], name: "index_entries_on_room_id"
|
21
|
+
t.index ["user_id"], name: "index_entries_on_user_id"
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table "rooms", force: :cascade do |t|
|
25
|
+
t.string "name"
|
26
|
+
t.datetime "created_at", precision: 6, null: false
|
27
|
+
t.datetime "updated_at", precision: 6, null: false
|
28
|
+
end
|
29
|
+
|
30
|
+
create_table "users", force: :cascade do |t|
|
31
|
+
t.string "email", default: "", null: false
|
32
|
+
t.string "encrypted_password", default: "", null: false
|
33
|
+
t.string "reset_password_token"
|
34
|
+
t.datetime "reset_password_sent_at"
|
35
|
+
t.datetime "remember_created_at"
|
36
|
+
t.string "name"
|
37
|
+
t.datetime "created_at", precision: 6, null: false
|
38
|
+
t.datetime "updated_at", precision: 6, null: false
|
39
|
+
t.string "provider", default: "email", null: false
|
40
|
+
t.string "uid", default: "", null: false
|
41
|
+
t.text "tokens"
|
42
|
+
t.index ["email"], name: "index_users_on_email", unique: true
|
43
|
+
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
|
44
|
+
t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true
|
45
|
+
end
|
46
|
+
|
47
|
+
add_foreign_key "entries", "rooms"
|
48
|
+
add_foreign_key "entries", "users"
|
49
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# This file is seed file for test data on development environment.
|
3
|
+
|
4
|
+
def clean_database
|
5
|
+
[Entry, Room, User].each do |model|
|
6
|
+
model.delete_all
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def reset_pk_sequence
|
11
|
+
ActiveRecord::Base.connection.execute("UPDATE sqlite_sequence SET seq = 0")
|
12
|
+
end
|
13
|
+
|
14
|
+
clean_database
|
15
|
+
puts "* Cleaned database"
|
16
|
+
|
17
|
+
reset_pk_sequence
|
18
|
+
puts "* Reset sequences for primary keys"
|
19
|
+
|
20
|
+
['Ichiro', 'Stephen', 'Klay', 'Kevin'].each do |name|
|
21
|
+
email = "#{name.downcase}@example.com"
|
22
|
+
user = User.create(
|
23
|
+
email: email,
|
24
|
+
password: 'changeit',
|
25
|
+
password_confirmation: 'changeit',
|
26
|
+
name: name,
|
27
|
+
uid: email
|
28
|
+
)
|
29
|
+
end
|
30
|
+
puts "* Created #{User.count} user records"
|
31
|
+
|
32
|
+
room = Room.create
|
33
|
+
puts "* Created #{Room.count} room records"
|
34
|
+
|
35
|
+
['Ichiro', 'Stephen'].each do |name|
|
36
|
+
user = User.find_by(name: name)
|
37
|
+
room.add_member(user)
|
38
|
+
end
|
39
|
+
puts "* Created #{Entry.count} entry records"
|
40
|
+
|
41
|
+
puts "Created amazon-chime-sdk-rails test records!"
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"name": "rails_app",
|
3
|
+
"private": true,
|
4
|
+
"dependencies": {
|
5
|
+
"@rails/actioncable": "^6.0.0",
|
6
|
+
"@rails/activestorage": "^6.0.0",
|
7
|
+
"@rails/ujs": "^6.0.0",
|
8
|
+
"@rails/webpacker": "4.3.0",
|
9
|
+
"amazon-chime-sdk-js": "^1.17.2",
|
10
|
+
"axios": "^0.20.0",
|
11
|
+
"turbolinks": "^5.2.0",
|
12
|
+
"vue": "^2.6.12",
|
13
|
+
"vue-loader": "^15.9.3",
|
14
|
+
"vue-router": "^3.4.3",
|
15
|
+
"vue-template-compiler": "^2.6.12",
|
16
|
+
"vuex": "^3.5.1",
|
17
|
+
"vuex-persistedstate": "^3.1.0"
|
18
|
+
},
|
19
|
+
"version": "0.1.0",
|
20
|
+
"devDependencies": {
|
21
|
+
"webpack-dev-server": "^3.11.0"
|
22
|
+
}
|
23
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
.rails-default-error-page {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
.rails-default-error-page div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
.rails-default-error-page div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
.rails-default-error-page h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
.rails-default-error-page div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body class="rails-default-error-page">
|
58
|
+
<!-- This file lives in public/404.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
62
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
.rails-default-error-page {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
.rails-default-error-page div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
.rails-default-error-page div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
.rails-default-error-page h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
.rails-default-error-page div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body class="rails-default-error-page">
|
58
|
+
<!-- This file lives in public/422.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
.rails-default-error-page {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
.rails-default-error-page div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
.rails-default-error-page div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
.rails-default-error-page h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
.rails-default-error-page div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body class="rails-default-error-page">
|
58
|
+
<!-- This file lives in public/500.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
62
|
+
</div>
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
64
|
+
</div>
|
65
|
+
</body>
|
66
|
+
</html>
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
|
File without changes
|
@@ -0,0 +1,182 @@
|
|
1
|
+
describe ChimeSdk::Controller::Attendees, type: :request do
|
2
|
+
before(:all) do
|
3
|
+
@meeting_id = "01234567-89ab-cdef-ghij-klmnopqrstuv"
|
4
|
+
@attendee_id = "76543210-ba98-fedc-jihg-vutsrqponmlk"
|
5
|
+
@dummy_meeting_id = "91234567-89ab-cdef-ghij-klmnopqrstuv"
|
6
|
+
@dummy_attendee_id = "96543210-ba98-fedc-jihg-vutsrqponmlk"
|
7
|
+
|
8
|
+
@room = create(:room)
|
9
|
+
@attendee_user = create(:user)
|
10
|
+
@room.add_member(@attendee_user)
|
11
|
+
test_attendee = {
|
12
|
+
external_user_id: "ChimeSdkRailsApp-test-User-#{@attendee_user.id}",
|
13
|
+
attendee_id: @attendee_id,
|
14
|
+
join_token: "dummy"
|
15
|
+
}
|
16
|
+
dummy_attendee = {
|
17
|
+
external_user_id: "ChimeSdkRailsApp-test-User-0",
|
18
|
+
attendee_id: @dummy_attendee_id,
|
19
|
+
join_token: "dummy"
|
20
|
+
}
|
21
|
+
|
22
|
+
# Use stubs for the AWS SDK for Ruby
|
23
|
+
client = Aws::Chime::Client.new(stub_responses: true)
|
24
|
+
client.stub_responses(:list_attendees, {
|
25
|
+
attendees: [ test_attendee, dummy_attendee ]
|
26
|
+
})
|
27
|
+
client.stub_responses(:get_attendee, -> (context) {
|
28
|
+
context.params[:meeting_id] == @meeting_id ?
|
29
|
+
(context.params[:attendee_id] == @attendee_id ? { attendee: test_attendee } : 'NotFoundException') :
|
30
|
+
'ForbiddenException'
|
31
|
+
})
|
32
|
+
client.stub_responses(:create_attendee, -> (context) {
|
33
|
+
context.params[:meeting_id] == @meeting_id ? {
|
34
|
+
attendee: {
|
35
|
+
external_user_id: context.params[:external_user_id],
|
36
|
+
attendee_id: @attendee_id,
|
37
|
+
join_token: "dummy"
|
38
|
+
}
|
39
|
+
} : 'BadRequestException'
|
40
|
+
})
|
41
|
+
client.stub_responses(:delete_attendee, -> (context) {
|
42
|
+
context.params[:attendee_id] == @attendee_id ? {} : 'NotFoundException'
|
43
|
+
})
|
44
|
+
ChimeSdk::MeetingCoordinator.reset_client(client)
|
45
|
+
end
|
46
|
+
|
47
|
+
context "Rails API" do
|
48
|
+
let(:api_root_path) { "/api/v1" }
|
49
|
+
let(:api_path) { "#{api_root_path}/rooms/#{@room.id}" }
|
50
|
+
let(:api_meetings_path) { "#{api_path}/meetings/#{@meeting_id}" }
|
51
|
+
|
52
|
+
before do
|
53
|
+
@user = create(:user)
|
54
|
+
end
|
55
|
+
|
56
|
+
context "requests from unauthorized user" do
|
57
|
+
describe "GET /meetings/:meeting_id/attendees" do
|
58
|
+
it "returns response with 401 status" do
|
59
|
+
get "#{api_meetings_path}/attendees", headers: @auth_headers
|
60
|
+
expect(response).to have_http_status(401)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "requests from authorized user" do
|
66
|
+
before do
|
67
|
+
# Sign in with Devise Token Auth
|
68
|
+
post "#{api_root_path}/auth/sign_in", params: { email: @user.email, password: "password" }
|
69
|
+
@auth_headers = response.header.slice("access-token", "client", "uid")
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the authorized user is not a member of the private room" do
|
73
|
+
describe "GET /meetings/:meeting_id/attendees" do
|
74
|
+
it "returns response with 403 status" do
|
75
|
+
get "#{api_meetings_path}/attendees", headers: @auth_headers
|
76
|
+
expect(response).to have_http_status(403)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when the authorized user is a member of the private room" do
|
82
|
+
before do
|
83
|
+
@room.add_member(@user)
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "GET /meetings/:meeting_id/attendees" do
|
87
|
+
before do
|
88
|
+
get "#{api_meetings_path}/attendees", headers: @auth_headers
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns response with 200 status" do
|
92
|
+
expect(response).to have_http_status(200)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "returns attendees list" do
|
96
|
+
expect(JSON.parse(response.body)["attendees"].length).to eq(2)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "returns valid attendee in the list" do
|
100
|
+
expect(JSON.parse(response.body)["attendees"][0]["Attendee"]["AttendeeId"]).to eq(@attendee_id)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "GET /meetings/:meeting_id/attendees/:attendee_id" do
|
105
|
+
context "when the attendee is found" do
|
106
|
+
before do
|
107
|
+
get "#{api_meetings_path}/attendees/#{@attendee_id}", headers: @auth_headers
|
108
|
+
end
|
109
|
+
|
110
|
+
it "returns response with 200 status" do
|
111
|
+
expect(response).to have_http_status(200)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "returns valid attendee" do
|
115
|
+
expect(JSON.parse(response.body)["Attendee"]["AttendeeId"]).to eq(@attendee_id)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "returns application metadata in the attendee" do
|
119
|
+
expect(JSON.parse(response.body)["Attendee"]["ApplicationMetadata"]["User"]["id"]).to eq(@attendee_user.id)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when the attendee is not found" do
|
124
|
+
before do
|
125
|
+
get "#{api_meetings_path}/attendees/#{@dummy_attendee_id}", headers: @auth_headers
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns response with 404 status" do
|
129
|
+
expect(response).to have_http_status(404)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "when the attendee is not in the meeting" do
|
134
|
+
before do
|
135
|
+
get "#{api_path}/meetings/#{@dummy_meeting_id}/attendees/#{@dummy_attendee_id}", headers: @auth_headers
|
136
|
+
end
|
137
|
+
|
138
|
+
it "returns response with 403 status" do
|
139
|
+
expect(response).to have_http_status(403)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "POST /meetings/:meeting_id/attendees" do
|
145
|
+
before do
|
146
|
+
post "#{api_meetings_path}/attendees", headers: @auth_headers
|
147
|
+
end
|
148
|
+
|
149
|
+
it "returns response with 201 status" do
|
150
|
+
expect(response).to have_http_status(201)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "returns created attendee" do
|
154
|
+
expect(JSON.parse(response.body)["Attendee"]["AttendeeId"]).to eq(@attendee_id)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "DELETE /meetings/:meeting_id/attendees/:attendee_id" do
|
159
|
+
context "when the attendee is found" do
|
160
|
+
before do
|
161
|
+
delete "#{api_meetings_path}/attendees/#{@attendee_id}", headers: @auth_headers
|
162
|
+
end
|
163
|
+
|
164
|
+
it "returns response with 204 status" do
|
165
|
+
expect(response).to have_http_status(204)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "when the attendee is not found" do
|
170
|
+
before do
|
171
|
+
get "#{api_meetings_path}/attendees/#{@dummy_attendee_id}", headers: @auth_headers
|
172
|
+
end
|
173
|
+
|
174
|
+
it "returns response with 404 status" do
|
175
|
+
expect(response).to have_http_status(404)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|