ADD action cable for migrate project
This commit is contained in:
		
							parent
							
								
									ba79b8f4e6
								
							
						
					
					
						commit
						c1a5c390f7
					
				| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
// Action Cable provides the framework to deal with WebSockets in Rails.
 | 
			
		||||
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
 | 
			
		||||
//
 | 
			
		||||
//= require action_cable
 | 
			
		||||
//= require_self
 | 
			
		||||
//= require_tree ./channels
 | 
			
		||||
 | 
			
		||||
(function() {
 | 
			
		||||
  this.App || (this.App = {});
 | 
			
		||||
 | 
			
		||||
  App.cable = ActionCable.createConsumer();
 | 
			
		||||
 | 
			
		||||
}).call(this);
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
App.mirror_project = App.cable.subscriptions.create("MirrorProjectChannel", {
 | 
			
		||||
  connected: function() {
 | 
			
		||||
    // Called when the subscription is ready for use on the server
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  disconnected: function() {
 | 
			
		||||
    // Called when the subscription has been terminated by the server
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  received: function(data) {
 | 
			
		||||
    // Called when there's incoming data on the websocket for this channel
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,20 @@
 | 
			
		|||
module ApplicationCable
 | 
			
		||||
  class Connection < ActionCable::Connection::Base
 | 
			
		||||
    identified_by :current_user
 | 
			
		||||
 | 
			
		||||
    def connect
 | 
			
		||||
      self.current_user = find_verified_user
 | 
			
		||||
      logger.add_tags 'ActionCable', current_user.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
      def find_verified_user
 | 
			
		||||
        puts "############### cookies.signed[:signed_user_id]: #{cookies.signed[:user_id]}"
 | 
			
		||||
        if current_user = User.find_by(id: cookies.signed[:user_id])
 | 
			
		||||
          current_user
 | 
			
		||||
        else
 | 
			
		||||
          reject_unauthorized_connection
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
class MirrorProjectChannel < ApplicationCable::Channel
 | 
			
		||||
  def subscribed
 | 
			
		||||
    Rails.logger.info "################### channel params: #{params}"
 | 
			
		||||
    # @project = Project.find_by_identifier params[:id]
 | 
			
		||||
    stream_from "channel_room_#{params[:id]}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def unsubscribed
 | 
			
		||||
    # Any cleanup needed when channel is unsubscribed
 | 
			
		||||
    Rails.logger.info "################### unsubscribed ################### "
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -269,7 +269,9 @@ class AccountsController < ApplicationController
 | 
			
		|||
      cookie_options = cookie_options.merge(domain: edu_setting('cookie_domain'))
 | 
			
		||||
    end
 | 
			
		||||
    cookies[autologin_cookie_name] = cookie_options
 | 
			
		||||
    logger.info("cookies is #{cookies}")
 | 
			
		||||
    cookies.signed[:user_id] ||= user.id
 | 
			
		||||
 | 
			
		||||
    logger.info("cookies is #{cookies} ======> #{cookies.signed[:user_id]} =====> #{cookies[autologin_cookie_name]}")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def logout
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -342,7 +342,9 @@ class ApplicationController < ActionController::Base
 | 
			
		|||
			elsif params[:debug] == 'student'
 | 
			
		||||
				User.current = User.find 8686
 | 
			
		||||
			elsif params[:debug] == 'admin'
 | 
			
		||||
				User.current = User.find 1
 | 
			
		||||
				user = User.find 1
 | 
			
		||||
				User.current = user
 | 
			
		||||
				cookies.signed[:user_id] = user.id
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		# User.current = User.find 81403
 | 
			
		||||
| 
						 | 
				
			
			@ -386,7 +388,6 @@ class ApplicationController < ActionController::Base
 | 
			
		|||
		else
 | 
			
		||||
			User.current
 | 
			
		||||
		end
 | 
			
		||||
		# User.current
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	## 默认输出json
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,10 @@ module LoginHelper
 | 
			
		|||
    unless  cookies[autologin_cookie_name].present?
 | 
			
		||||
      cookies[autologin_cookie_name] = cookie_options
 | 
			
		||||
    end
 | 
			
		||||
    # for action cable
 | 
			
		||||
    cookies.signed[:user_id] ||= user.id
 | 
			
		||||
 | 
			
		||||
    Rails.logger.info("cookies is #{cookies}")
 | 
			
		||||
    Rails.logger.info("cookies is #{cookies} ======> #{cookies.signed[:user_id]}")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def successful_authentication(user)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,14 +2,32 @@ class MigrateRemoteRepositoryJob < ApplicationJob
 | 
			
		|||
  queue_as :default
 | 
			
		||||
 | 
			
		||||
  def perform(repo_id, token, params)
 | 
			
		||||
    puts "############ perform: repo_id: #{repo_id}, token: #{token}, params: #{params}}"
 | 
			
		||||
    repo = Repository.find_by(id: repo_id)
 | 
			
		||||
    return if repo.blank?
 | 
			
		||||
 | 
			
		||||
    puts "############ MigrateRemoteRepositoryJob starting ... ############"
 | 
			
		||||
 | 
			
		||||
    gitea_repository = Gitea::Repository::MigrateService.new(token, params).call
 | 
			
		||||
    if gitea_repository
 | 
			
		||||
      repo&.project&.update_columns(gpid: gitea_repository["id"])
 | 
			
		||||
      repo&.mirror&.update_columns(status: Mirror.statuses[:succeeded])
 | 
			
		||||
 | 
			
		||||
      project = repo.project
 | 
			
		||||
 | 
			
		||||
      json_data = {
 | 
			
		||||
        mirror_status: repo.mirror_status,
 | 
			
		||||
        mirror_num: repo.mirror_num,
 | 
			
		||||
        mirror_url: repo.mirror_url,
 | 
			
		||||
        first_sync: repo.first_sync?,
 | 
			
		||||
        identifier: repo.identifier,
 | 
			
		||||
        name: project.name,
 | 
			
		||||
        id: project.id,
 | 
			
		||||
        type: project.numerical_for_project_type
 | 
			
		||||
      }
 | 
			
		||||
      puts "############ broadcast start.......... ############"
 | 
			
		||||
      cable_result = ActionCable.server.broadcast "channel_room_#{repo.identifier}", project: json_data
 | 
			
		||||
 | 
			
		||||
      puts "############ room_channel_#{repo.identifier} result : #{cable_result}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,6 @@ class Gitea::Repository::Entries::ListService < Gitea::ClientService
 | 
			
		|||
    when 200
 | 
			
		||||
      body
 | 
			
		||||
    else
 | 
			
		||||
      Rails.logger.info("########__________has_error_______##########{body['message']}")
 | 
			
		||||
     []
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
bundle exec puma -p 28080 cable/config.ru
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
require_relative '../config/environment'
 | 
			
		||||
Rails.application.eager_load!
 | 
			
		||||
 | 
			
		||||
run ActionCable.server
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +29,9 @@ module Educoderplus
 | 
			
		|||
    # job
 | 
			
		||||
    config.active_job.queue_adapter = :sidekiq
 | 
			
		||||
 | 
			
		||||
    # disable actioncable development nend true
 | 
			
		||||
    # config.action_cable.disable_request_forgery_protection = true
 | 
			
		||||
 | 
			
		||||
    config.middleware.use OmniAuth::Builder do
 | 
			
		||||
      provider :cas, url: 'https://urp.tfswufe.edu.cn/cas'
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,12 @@
 | 
			
		|||
development:
 | 
			
		||||
  adapter: async
 | 
			
		||||
  adapter: redis
 | 
			
		||||
  url: redis://localhost:6379
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
  adapter: async
 | 
			
		||||
  adapter: redis
 | 
			
		||||
  url: redis://localhost:6379
 | 
			
		||||
 | 
			
		||||
production:
 | 
			
		||||
  adapter: redis
 | 
			
		||||
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
 | 
			
		||||
  channel_prefix: educoderplus_production
 | 
			
		||||
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379" } %>
 | 
			
		||||
  channel_prefix: forgeplus_production
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,12 @@ Rails.application.routes.draw do
 | 
			
		|||
 | 
			
		||||
  require 'sidekiq/web'
 | 
			
		||||
  require 'admin_constraint'
 | 
			
		||||
  # mount Sidekiq::Web => '/sidekiq'
 | 
			
		||||
 | 
			
		||||
  mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new
 | 
			
		||||
 | 
			
		||||
  # Serve websocket cable requests in-process
 | 
			
		||||
  mount ActionCable.server => '/cable'
 | 
			
		||||
 | 
			
		||||
  get 'attachments/download/:id', to: 'attachments#show'
 | 
			
		||||
  get 'attachments/download/:id/:filename', to: 'attachments#show'
 | 
			
		||||
  get 'auth/qq/callback', to: 'oauth/qq#create'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue