#coding=utf-8 # status值 # 0:成功;-1:500错误;403:无权限;404:页面不存在 module Mobile # require_relative 'middleware/error_handler' # require_relative 'apis/auth' # require_relative 'apis/users' # require_relative 'apis/courses' # require_relative 'apis/watches' # require_relative 'apis/upgrade' # require_relative 'apis/homeworks' # require_relative 'apis/comments' # require_relative 'apis/issues' # require_relative 'apis/activities' # require_relative 'apis/whomeworks' # require_relative 'apis/newss' # require_relative 'apis/journal_for_messages' # require_relative 'apis/messages' # require_relative 'apis/blog_comments' # require_relative 'apis/new_comment' # require_relative 'apis/praise' # require_relative 'apis/resources' # require_relative 'apis/syllabuses' # require_relative 'apis/projects' # require_relative 'apis/games' # require_relative 'apis/shixuns' # require_relative 'apis/discusses' # require_relative 'apis/memos' # require_relative 'apis/sources' # require_relative 'apis/careers' class API < Grape::API version 'v1', using: :path format :json content_type :json, "application/json;charset=UTF-8" #use ActionDispatch::Session::CookieStore, :expire_after => 8.hours, :key => '_educoder_session', :domain => :all require 'digest' use Mobile::Middleware::ErrorHandler helpers do def logger Rails.logger end def authenticate! error!('401 Unauthorized', 401) unless current_user end def private_auth Rails.logger.info("#########{params[:private_token]}") error!('401 Unauthorized', 401) if params[:private_token] != "hriEn3UwXfJs3PmyXnSG" end def cnmooc_access_key! ## 签名 accessKeyId = 'LTAISM4HFWpQHh3g'.freeze accessKeySecret = '9NMU8ushmFu8SN1EKHOhvo9jmv1qp0'.freeze str = [] params.each do |key, value| if key != "sign" str << "#{key}=#{value}" end end sign_str = "#{str.join("&")}&sk=#{accessKeySecret}" Rails.logger.info("#####sign_str: #{sign_str}") sign = Digest::MD5.hexdigest("#{sign_str}").upcase Rails.logger.info("#####sign: #{sign}") Rails.logger.info("#####params[:sign]: #{params[:sign]}") if params[:sign] != sign error!('401 Unauthorized', 401) end end # 有一些接口没登录也能查看数据 def career_authenticate! pass = request.path.include?("introduction") || request.path.include?("get_published_careers")|| request.path.include?("get_current_user") unless pass error!('401 Unauthorized', 401) unless current_user end end def memo_authenticate! Rails.logger.info("#######current_user: ###{current_user}") Rails.logger.info("#######session: ###{session[:user_id]}") pass = (request.path.match(/memos\/\d+/).present? && !request.path.include?("reply")) || request.path.include?("get_memos_list") || request.path.include?("memos?page=") || request.path.match(/memos$/).present? unless pass error!('401 Unauthorized', 401) unless current_user end end def discusses_authenticate! Rails.logger.info("#######current_user: ###{current_user}") Rails.logger.info("#######session: ###{session[:user_id]}") pass = request.path.match(/discusses$/).present? || request.path.include?("discusses?page=") unless pass error!('401 Unauthorized', 401) unless current_user end end # def manager_of_game # myshixun_id = Game.where(:identifier => params[:identifier]).pluck(:myshixun_id).first # myshixun = Myshixun.find(myshixun_id) # unless (current_user.admin? || myshixun.user_id == current_user.id) # return {} # end # end # def session env['rack.session'] end def current_user openid = session[:wechat_openid] if openid uw = UserWechat.find_by_openid(openid) return uw.user if uw end # third_party_user_id = session[:third_party_user_id] # Rails.logger.info("#########third_party_user_id: #{third_party_user_id}") # if third_party_user_id # c_user = UserSource.find_by_id(session[:third_party_user_id]) # return c_user.user if c_user # end token = ApiKey.where(access_token: params[:token]).first if token && !token.expired? return User.find(token.user_id) end # Rails.logger.info("########### host is #{request.host}") if (Rails.env.development? && session[:user_id].blank?) || params[:action] == "privateGit" session[:user_id] = 12 #116 end Rails.logger.info("####### session user_id is #{session[:user_id]}") if session[:user_id] user = (User.active.find(session[:user_id]) rescue nil) else autologin_cookie = Redmine::Configuration['autologin_cookie_name'].presence || 'autologin' if cookies[autologin_cookie] && Setting.autologin? user = User.try_to_autologin(cookies[autologin_cookie]) if user # reset_session # start_user_session(user) session[:user_id] = user.id session[:ctime] = Time.now.utc.to_i session[:atime] = Time.now.utc.to_i end user end end return user if user nil end def paginate(objs) page = params[:page].to_i <= 0 ? 1 : params[:page].to_i per_page = params[:per_page].to_i > 0 ? params[:per_page].to_i : 20 Kaminari.paginate_array(objs).page(page).per(per_page) end def render_ok(data = {}) { status: 0, message: 'success' }.merge(data) end def render_error(message) { status: -1, message: message } end end mount Apis::Auth mount Apis::Users mount Apis::Courses mount Apis::Watches mount Apis::Upgrade mount Apis::Homeworks mount Apis::Comments mount Apis::Issues mount Apis::Activities mount Apis::Whomeworks mount Apis::Newss mount Apis::JournalForMessages mount Apis::Messages mount Apis::BlogComments mount Apis::NewComment mount Apis::Praise mount Apis::Resources mount Apis::Syllabuses mount Apis::Projects mount Apis::Games mount Apis::Shixuns mount Apis::Discusses mount Apis::Memos mount Apis::Sources mount Apis::Careers mount Apis::Assets mount Apis::Ecloud mount Apis::Cnmooc mount Apis::ProjectPackages mount Apis::ProjectPackageCategories # add_swagger_documentation ({host: 'educoder.0bug.info', api_version: 'v1', base_path: '/api'}) if Rails.env.development? add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development? end end