common_engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +24 -0
  3. data/Rakefile +6 -0
  4. data/app/assets/config/manifest.js +3 -0
  5. data/app/assets/javascripts/application.js +16 -0
  6. data/app/assets/javascripts/cable.js +13 -0
  7. data/app/assets/javascripts/init_fullcalendar.js +40 -0
  8. data/app/assets/stylesheets/application.css +15 -0
  9. data/app/channels/application_cable/channel.rb +4 -0
  10. data/app/channels/application_cable/connection.rb +4 -0
  11. data/app/controllers/application_base_controller.rb +61 -0
  12. data/app/controllers/concerns/fullcalendar_utility.rb +47 -0
  13. data/app/controllers/concerns/zoom_utility.rb +110 -0
  14. data/app/helpers/application_helper.rb +2 -0
  15. data/app/jobs/application_job.rb +2 -0
  16. data/app/mailers/application_mailer.rb +4 -0
  17. data/app/models/application_base_record.rb +48 -0
  18. data/app/models/common_engine/admin.rb +13 -0
  19. data/app/models/common_engine/admin_login_history.rb +5 -0
  20. data/app/models/common_engine/chapter.rb +25 -0
  21. data/app/models/common_engine/commodity.rb +6 -0
  22. data/app/models/common_engine/course.rb +8 -0
  23. data/app/models/common_engine/event.rb +5 -0
  24. data/app/models/common_engine/favorite.rb +8 -0
  25. data/app/models/common_engine/group.rb +9 -0
  26. data/app/models/common_engine/idle.rb +35 -0
  27. data/app/models/common_engine/idle_login_history.rb +7 -0
  28. data/app/models/common_engine/notice.rb +8 -0
  29. data/app/models/common_engine/schedule.rb +32 -0
  30. data/app/models/common_engine/settlement_history.rb +8 -0
  31. data/app/models/common_engine/user.rb +15 -0
  32. data/app/models/common_engine/user_login_history.rb +7 -0
  33. data/app/models/concerns/image_uploader.rb +49 -0
  34. data/app/models/concerns/login_module.rb +14 -0
  35. data/app/views/_prepare_fullcalendar.slim +20 -0
  36. data/app/views/errors/error_404.html.slim +1 -0
  37. data/app/views/errors/error_500.html.slim +1 -0
  38. data/app/views/layouts/application_base.html.erb +29 -0
  39. data/config/application.rb +19 -0
  40. data/config/boot.rb +4 -0
  41. data/config/cable.yml +10 -0
  42. data/config/credentials.yml.enc +1 -0
  43. data/config/database.yml +93 -0
  44. data/config/environment.rb +5 -0
  45. data/config/environments/development.rb +61 -0
  46. data/config/environments/production.rb +94 -0
  47. data/config/environments/test.rb +46 -0
  48. data/config/initializers/application_controller_renderer.rb +10 -0
  49. data/config/initializers/assets.rb +14 -0
  50. data/config/initializers/backtrace_silencers.rb +7 -0
  51. data/config/initializers/content_security_policy.rb +25 -0
  52. data/config/initializers/cookies_serializer.rb +5 -0
  53. data/config/initializers/filter_parameter_logging.rb +4 -0
  54. data/config/initializers/inflections.rb +16 -0
  55. data/config/initializers/mime_types.rb +4 -0
  56. data/config/initializers/wrap_parameters.rb +14 -0
  57. data/config/locales/en.yml +251 -0
  58. data/config/locales/ja.yml +255 -0
  59. data/config/locales/vi.yml +249 -0
  60. data/config/puma.rb +34 -0
  61. data/config/routes.rb +3 -0
  62. data/config/spring.rb +6 -0
  63. data/config/storage.yml +34 -0
  64. data/db/schema.rb +18 -0
  65. data/db/seeds.rb +7 -0
  66. data/lib/common_engine.rb +9 -0
  67. data/lib/common_engine/engine.rb +5 -0
  68. data/lib/common_engine/version.rb +3 -0
  69. metadata +125 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 60cd7fe237812c298ece8806d4e4bd4b39a0aec154a20d743811be9ecbc910df
4
+ data.tar.gz: 7c65186781fd5b34e6e22af2306c92d01a00f3a96beb21597648bdeca282bab5
5
+ SHA512:
6
+ metadata.gz: 8cf3a899d4012a852c9c16d718e8fbda55e2fa6a955523b6fa52829eee1d4f22cea7b1780c57709422e912dd2b02e19dedadcf843651a3f6b62ff2d9d7b45cee
7
+ data.tar.gz: c4808ef62422cbd377657595b8f1a1d2bcba13ef7fe2d18d12d4bf48472e5c35f5505fad25e03428d712af109d17f7639e77da1bd0ce600fb0c00324c5ffcd9d
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative 'config/application'
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -0,0 +1,16 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
5
+ // vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require activestorage
15
+ //= require turbolinks
16
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ // Action Cable provides the framework to deal with WebSockets in Rails.
2
+ // You can generate new channels where WebSocket features live using the `rails generate channel` command.
3
+ //
4
+ //= require action_cable
5
+ //= require_self
6
+ //= require_tree ./channels
7
+
8
+ (function() {
9
+ this.App || (this.App = {});
10
+
11
+ App.cable = ActionCable.createConsumer();
12
+
13
+ }).call(this);
@@ -0,0 +1,40 @@
1
+ function initFullCallendar() {
2
+ $('#calendar').empty();
3
+ $('#calendar').fullCalendar({
4
+ header: {
5
+ left: 'prev,next today',
6
+ center: 'title',
7
+ right: 'month agendaWeek agendaDay'
8
+ },
9
+ defaultView: 'agendaWeek',
10
+ weekends: true,
11
+ firstHour: 9,
12
+ minTime: '09:00:00',
13
+ maxTime: '20:00:00',
14
+ height: 'auto',
15
+ allDaySlot: false,
16
+ views: {
17
+ month: {
18
+ titleFormat: titleFormatMonth
19
+ },
20
+ week: {
21
+ titleFormat: titleFormatWeek
22
+ },
23
+ day: {
24
+ titleFormat: titleFormatDay
25
+ }
26
+ },
27
+ buttonText: {
28
+ prev: '<',
29
+ next: '>',
30
+ month: monthText,
31
+ week: weekText,
32
+ day: dayText,
33
+ today: todayText
34
+ },
35
+ dayNames: weekdayNames,
36
+ dayNamesShort: weekdayShortNames,
37
+ eventClick: eventClickFunc,
38
+ events: allEvents
39
+ })
40
+ }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
6
+ * vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,61 @@
1
+ require_relative 'concerns/fullcalendar_utility.rb'
2
+ require_relative 'concerns/zoom_utility.rb'
3
+ require_relative '../models/concerns/login_module.rb'
4
+
5
+ class ApplicationBaseController < ActionController::Base
6
+ include CommonEngine::FullcalendarUtility
7
+ include CommonEngine::ZoomUtility
8
+
9
+ protect_from_forgery with: :exception
10
+
11
+ SELECT_LANGUAGE_MESSAGE = 'Select Language'.freeze
12
+
13
+ if !Rails.env.development?
14
+ rescue_from Exception, with: :handle_500_fatal
15
+ rescue_from StandardError, with: :handle_500
16
+ rescue_from ActiveRecord::RecordNotFound, AbstractController::ActionNotFound, with: :handle_404
17
+ end
18
+
19
+ def handle_500_fatal(exception = nil)
20
+ logger.fatal exception.message if exception
21
+ render_error 500
22
+ end
23
+ def handle_500(exception = nil)
24
+ logger.error exception.message if exception
25
+ render_error 500
26
+ end
27
+ def handle_404(exception = nil)
28
+ logger.warn exception.message if exception
29
+ render_error 404
30
+ end
31
+ # called from config/initializers/application_controller_renderer.rb
32
+ def handle_uncatchable
33
+ logger.error "Requested: #{request.env['action_dispatch.original_path']}"
34
+ logger.error request.env['action_dispatch.exception']
35
+ status = request.path[1..-1].to_i
36
+ render_error 500
37
+ end
38
+
39
+ private
40
+ def render_error(status)
41
+ if request.xhr? || params[:format] == :json
42
+ render :json, status: status
43
+ else
44
+ set_locale
45
+ render template: "errors/error_#{status}", formats: :html, status: status, layout: 'application_base', content_type: 'text/html'
46
+ end
47
+ end
48
+ def set_locale
49
+ I18n.locale = locale
50
+ @locale_map = {}
51
+ I18n.available_locales.each do |available_locale|
52
+ @locale_map[available_locale.to_s] = t('common.language', locale: available_locale)
53
+ end
54
+ end
55
+ def locale
56
+ @locale ||= params[:locale] || I18n.default_locale
57
+ end
58
+ def default_url_options(options={})
59
+ options.merge(locale: locale)
60
+ end
61
+ end
@@ -0,0 +1,47 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'uri'
4
+ require 'jwt'
5
+
6
+ module CommonEngine
7
+ module FullcalendarUtility
8
+ extend ActiveSupport::Concern
9
+
10
+ def prepare_fullcalendar
11
+ @weekday_names = get_weekday_names().to_json.html_safe
12
+ @weekday_short_names = get_weekday_short_names().to_json.html_safe
13
+ @empty_event_title = t('common.empty_event_title')
14
+ @title_format_month = t('format.fullcalendar.title.month')
15
+ @title_format_week = t('format.fullcalendar.title.week').html_safe
16
+ @title_format_day = t('format.fullcalendar.title.day').html_safe
17
+ @month_text = t('format.fullcalendar.button_text.month')
18
+ @week_text = t('format.fullcalendar.button_text.week')
19
+ @day_text = t('format.fullcalendar.button_text.day')
20
+ @today_text = t('format.fullcalendar.button_text.today')
21
+ end
22
+
23
+ private
24
+ def get_weekday_names
25
+ return [
26
+ t('common.weekday_names.Sunday'),
27
+ t('common.weekday_names.Monday'),
28
+ t('common.weekday_names.Tuesday'),
29
+ t('common.weekday_names.Wednesday'),
30
+ t('common.weekday_names.Thursday'),
31
+ t('common.weekday_names.Friday'),
32
+ t('common.weekday_names.Saturday')
33
+ ]
34
+ end
35
+ def get_weekday_short_names
36
+ return [
37
+ t('common.weekday_names.short.Sunday'),
38
+ t('common.weekday_names.short.Monday'),
39
+ t('common.weekday_names.short.Tuesday'),
40
+ t('common.weekday_names.short.Wednesday'),
41
+ t('common.weekday_names.short.Thursday'),
42
+ t('common.weekday_names.short.Friday'),
43
+ t('common.weekday_names.short.Saturday')
44
+ ]
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,110 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'uri'
4
+ require 'jwt'
5
+
6
+ module CommonEngine
7
+ module ZoomUtility
8
+ extend ActiveSupport::Concern
9
+
10
+ ZOOM_PASSWORD = 'asp123'.freeze
11
+ ZOOM_USER_LAST_NAME = 'AfterSchool-Project'.freeze
12
+ ZOOM_DATETIME_FORMAT = "%Y-%m-%d'T'%H:%M:%S'Z'".freeze
13
+ ZOOM_DURATION = 90.freeze
14
+
15
+ # see https://zoom.github.io/api/?shell#create-a-user for more information
16
+ def create_zoom_user(email)
17
+ url = 'https://api.zoom.us/v2/users'
18
+ data = {
19
+ action: 'create',
20
+ user_info: {
21
+ email: email,
22
+ password: ZOOM_PASSWORD,
23
+ type: 1
24
+ }
25
+ }
26
+ return ActiveSupport::JSON.decode(send_ssl_post(url, data).body)
27
+ end
28
+
29
+ def delete_zoom_user(email)
30
+ url = 'https://api.zoom.us/v2/users/' + email
31
+ data = {
32
+ action: 'delete'
33
+ }
34
+ send_ssl_delete(url, data).body
35
+ end
36
+
37
+ # see https://zoom.github.io/api/?shell#create-a-meeting for more information
38
+ def create_meeting(zoom_user_id, chapter_id, start_datetime)
39
+ url = 'https://api.zoom.us/v2/users/' + zoom_user_id + '/meetings'
40
+ chapter = CommonEngine::Chapter.joins(:course).includes(:course).find(chapter_id)
41
+ data = {
42
+ topic: chapter.course.name + ' ' + chapter.name,
43
+ type: 2,
44
+ start_time: start_datetime.strftime(ZOOM_DATETIME_FORMAT),
45
+ duration: ZOOM_DURATION,
46
+ timezone: t('common.time_zone'),
47
+ password: ZOOM_PASSWORD,
48
+ settings: {
49
+ host_video: false,
50
+ participant_video: false,
51
+ join_before_host: true,
52
+ watermark: true,
53
+ approval_type: 2,
54
+ audio: 'both',
55
+ auto_recording: 'none',
56
+ enforce_login: false
57
+ }
58
+ }
59
+ return ActiveSupport::JSON.decode(send_ssl_post(url, data).body)
60
+ end
61
+
62
+ private
63
+ def send_ssl_post(url, data={})
64
+ return send_ssl(url, data, 'POST')
65
+ end
66
+
67
+ def send_ssl_put(url, data={})
68
+ return send_ssl(url, data, 'PUT')
69
+ end
70
+
71
+ def send_ssl_delete(url, data={})
72
+ return send_ssl(url, data, 'DELETE')
73
+ end
74
+
75
+ def send_ssl(url, data, method)
76
+ uri = URI.parse(url)
77
+ https = Net::HTTP.new(uri.host, uri.port)
78
+ https.use_ssl = true
79
+ req = Net::HTTP::Post.new(uri.request_uri) if method == 'POST'
80
+ req = Net::HTTP::PUT.new(uri.request_uri) if method == 'PUT'
81
+ req = Net::HTTP::Delete.new(uri.request_uri) if method == 'DELETE'
82
+
83
+ # set header
84
+ req['Content-Type'] = 'application/json'
85
+ req['Authorization'] = 'Bearer ' + get_token
86
+
87
+ # set body
88
+ req.body = data.to_json
89
+ return https.request(req)
90
+ end
91
+
92
+ def send_get(url, req_param_hash={})
93
+ param_string = '?'
94
+ req_param_hash.each {|key, value| param_string += key.to_s + '=' + value.to_s}
95
+ param_string += 'access_token=' + get_token
96
+ uri = URI.parse(url + req_params)
97
+ return Net::HTTP.get(uri)
98
+ end
99
+
100
+ def get_token
101
+ api_key = Rails.application.credentials.zoom[:api_key]
102
+ api_secret = Rails.application.credentials.zoom[:api_secret]
103
+ payload = {
104
+ iss: api_key,
105
+ exp: Time.now.utc.to_i + 60
106
+ }
107
+ return JWT.encode payload, api_secret, 'HS256'
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,48 @@
1
+ class ApplicationBaseRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+
4
+ def update_opt(*args)
5
+ set_updated_user_args(*args)
6
+ set_updated_at
7
+ begin
8
+ update(*args)
9
+ end
10
+ end
11
+
12
+ def save_opt!
13
+ set_created_user
14
+ set_updated_user
15
+ set_updated_at
16
+ begin
17
+ self.save!
18
+ rescue ActiveRecord::RecordNotUnique
19
+ errors.add :base, 'Could not save because of primary key restriction.'
20
+ false
21
+ end
22
+ end
23
+
24
+ def destroy_opt!
25
+ set_valid_flg
26
+ set_updated_user
27
+ set_updated_at
28
+ begin
29
+ self.save
30
+ end
31
+ end
32
+
33
+ def set_created_user
34
+ raise 'Extend this method'
35
+ end
36
+ def set_updated_user
37
+ raise 'Extend this method'
38
+ end
39
+ def set_updated_user_args(*args)
40
+ raise 'Extend this method'
41
+ end
42
+ def set_updated_at
43
+ self.updated_at = Time.now.utc
44
+ end
45
+ def set_valid_flg
46
+ self.valid_flg = true
47
+ end
48
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../concerns/login_module.rb'
2
+
3
+ module CommonEngine
4
+ class Admin < ApplicationRecord
5
+ include CommonEngine::LoginModule
6
+
7
+ default_scope -> {where(valid_flg: false)}
8
+ has_secure_password validations: true
9
+ validates :login_id, presence: true, uniqueness: true
10
+
11
+ has_many :admin_login_history
12
+ end
13
+ end