From d14312fa5cf2d580f4824aa07f5101a3445e5146 Mon Sep 17 00:00:00 2001 From: ryosk7 Date: Sun, 10 Mar 2024 17:26:15 +0900 Subject: [PATCH] Redis session --- backend/Gemfile | 3 +++ backend/Gemfile.lock | 15 +++++++++++++++ backend/app/controllers/redis_controller.rb | 10 ++++++++++ backend/app/controllers/session_controller.rb | 6 ++++++ .../controllers/user_coupons_controller.rb | 2 +- backend/app/controllers/users_controller.rb | 6 ++++++ backend/config/initializers/session_store.rb | 7 +++++++ backend/config/routes.rb | 7 +++++++ backend/dump.rdb | Bin 0 -> 529 bytes backend/spec/requests/redis_spec.rb | 7 +++++++ backend/spec/requests/session_spec.rb | 7 +++++++ frontend/src/app/services/session.service.ts | 18 ++++++++++++++++++ frontend/src/app/services/wallet.service.ts | 7 ++++++- 13 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 backend/app/controllers/redis_controller.rb create mode 100644 backend/app/controllers/session_controller.rb create mode 100644 backend/config/initializers/session_store.rb create mode 100644 backend/dump.rdb create mode 100644 backend/spec/requests/redis_spec.rb create mode 100644 backend/spec/requests/session_spec.rb create mode 100644 frontend/src/app/services/session.service.ts diff --git a/backend/Gemfile b/backend/Gemfile index 2c53374..af0b723 100644 --- a/backend/Gemfile +++ b/backend/Gemfile @@ -35,6 +35,9 @@ gem "bootsnap", require: false # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin Ajax possible gem "rack-cors" +gem "redis" +gem 'redis-actionpack' + group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "debug", platforms: %i[ mri windows ] diff --git a/backend/Gemfile.lock b/backend/Gemfile.lock index 668bdc1..8157349 100644 --- a/backend/Gemfile.lock +++ b/backend/Gemfile.lock @@ -185,6 +185,19 @@ GEM rake (13.1.0) rdoc (6.6.2) psych (>= 4.0.0) + redis (5.1.0) + redis-client (>= 0.17.0) + redis-actionpack (5.4.0) + actionpack (>= 5, < 8) + redis-rack (>= 2.1.0, < 4) + redis-store (>= 1.1.0, < 2) + redis-client (0.21.0) + connection_pool + redis-rack (3.0.0) + rack-session (>= 0.2.0) + redis-store (>= 1.2, < 2) + redis-store (1.10.0) + redis (>= 4, < 6) reline (0.4.3) io-console (~> 0.5) rspec-core (3.13.0) @@ -232,6 +245,8 @@ DEPENDENCIES puma (>= 5.0) rack-cors rails (~> 7.1.3, >= 7.1.3.2) + redis + redis-actionpack rspec-rails sqlite3 (~> 1.4) tzinfo-data diff --git a/backend/app/controllers/redis_controller.rb b/backend/app/controllers/redis_controller.rb new file mode 100644 index 0000000..00cf46a --- /dev/null +++ b/backend/app/controllers/redis_controller.rb @@ -0,0 +1,10 @@ +class RedisController < ApplicationController + def session_set + session[:test_time] = Time.current + render json: { status: "ok" } + end + + def session_get + render json: { time: session[:test_time]&.iso8601 } + end +end diff --git a/backend/app/controllers/session_controller.rb b/backend/app/controllers/session_controller.rb new file mode 100644 index 0000000..2f6cc9b --- /dev/null +++ b/backend/app/controllers/session_controller.rb @@ -0,0 +1,6 @@ +class SessionController < ApplicationController + def current_user_set + session[:current_user_id] = User.find_by(address: params[:address])&.id + render json: { status: "ok" } + end +end diff --git a/backend/app/controllers/user_coupons_controller.rb b/backend/app/controllers/user_coupons_controller.rb index 41e8099..7395f5e 100644 --- a/backend/app/controllers/user_coupons_controller.rb +++ b/backend/app/controllers/user_coupons_controller.rb @@ -4,7 +4,7 @@ class UserCouponsController < ApplicationController # GET /user_coupons # GET /user_coupons.json def index - @user_coupons = User.first.user_coupons || [] + @user_coupons = User.find_by(id: session[:current_user_id]).user_coupons || [] end # GET /user_coupons/1 diff --git a/backend/app/controllers/users_controller.rb b/backend/app/controllers/users_controller.rb index 7a696f9..3ecb2aa 100644 --- a/backend/app/controllers/users_controller.rb +++ b/backend/app/controllers/users_controller.rb @@ -17,6 +17,8 @@ def show def create @user = User.find_or_create_by(user_params) + binding.irb + if @user.present? render :show, status: :created, location: @user else @@ -50,4 +52,8 @@ def set_user def user_params params.require(:user).permit(:address, :name, :avatar) end + + def current_user + @current_user ||= session[:current_user_id] && User.find_by(id: session[:current_user_id]) + end end diff --git a/backend/config/initializers/session_store.rb b/backend/config/initializers/session_store.rb new file mode 100644 index 0000000..f537788 --- /dev/null +++ b/backend/config/initializers/session_store.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +Rails.application.config.middleware.insert_after ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies +Rails.application.config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::RedisStore, + servers: ["redis://#{ENV.fetch("REDIS_HOST") { "localhost" }}:6379/0"], + expire_after: 3.days, + key: "_redis_session_transback" diff --git a/backend/config/routes.rb b/backend/config/routes.rb index 18a8897..ecf82ad 100644 --- a/backend/config/routes.rb +++ b/backend/config/routes.rb @@ -1,9 +1,16 @@ Rails.application.routes.draw do + resource :redis, only: [] do + # redis working checker + get "/session_set", to: "redis#session_set" + get "/session_get", to: "redis#session_get" + end + defaults format: :json do resources :coupons resources :organizations resources :users resources :user_coupons + get "/current_user_set", to: "session#current_user_set" end # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html diff --git a/backend/dump.rdb b/backend/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..8a1bbb9e3b46797fba0cb02890f1f91ec74b81f3 GIT binary patch literal 529 zcmajaF>X{r41nQ>v{^0bkZ5UWsCG5uvEO*Nihv*`MT+DAk!S3YUa=6~+a(1@08voV zQs)j)5C`BOxxgbLj6|~)ab>yr{GT4aK00&G`|)va+70s$*6+myEO6ZacSzl4xIP&7 z@}^tc&BglG#@Ti-ov&?ubMf^_GtT5)nI{?Sy7|-mo=ol*-?lHlJZhTe;1#S^(iY81 z%ocK~l0{W6NEna85v|ehxbr { return new Observable(observer => { @@ -54,6 +58,7 @@ export class WalletService { ) }).pipe( concatMap(() => this.userService.postOrFetchUser(this._address())), + concatMap(() => this.sessionService.currentUserSession(this._address())), map(() => this._isConnected()) ); }