parent
b0db7dfece
commit
53ecf8718f
@ -0,0 +1,39 @@
|
|||||||
|
module Mobile
|
||||||
|
|
||||||
|
$LOAD_PATH << File.expand_path('..',__FILE__)
|
||||||
|
|
||||||
|
autoload :Auth, 'apis/auth'
|
||||||
|
autoload :Users, 'apis/users'
|
||||||
|
autoload :Courses, 'apis/courses'
|
||||||
|
|
||||||
|
class API < Grape::API
|
||||||
|
version 'v1', using: :path
|
||||||
|
format :json
|
||||||
|
|
||||||
|
helpers do
|
||||||
|
def logger
|
||||||
|
API.logger
|
||||||
|
end
|
||||||
|
|
||||||
|
def authticate!
|
||||||
|
error!('Unauthorized. Invalid or expired token.', 401) unless current_user
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_user
|
||||||
|
token = ApiKey.where(access_token: params[:token]).first
|
||||||
|
if token && !token.expired?
|
||||||
|
@current_user = User.find(token.user_id)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
mount Auth
|
||||||
|
mount Users
|
||||||
|
mount Courses
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
|||||||
|
module Mobile
|
||||||
|
class Auth < Grape::API
|
||||||
|
resource :auth do
|
||||||
|
desc "Creates and returns access_token if valid login"
|
||||||
|
params do
|
||||||
|
requires :login, type: String, desc: 'Username or email'
|
||||||
|
requires :password, type: String, desc: 'Password'
|
||||||
|
end
|
||||||
|
post :login do
|
||||||
|
user,last_logon = ::User.try_to_login(params[:login], params[:password])
|
||||||
|
if user
|
||||||
|
::ApiKey.delete_all(user_id: user.id)
|
||||||
|
key = ::ApiKey.create!(user_id: user.id)
|
||||||
|
{token: key.access_token}.merge(user.as_json).merge(user.extensions.as_json)
|
||||||
|
else
|
||||||
|
error!('Unauthorized.', 401)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
module Mobile
|
||||||
|
class Courses < Grape::API
|
||||||
|
resource :courses do
|
||||||
|
desc "get all courses"
|
||||||
|
params do
|
||||||
|
requires :per_page_count, type: Integer
|
||||||
|
requires :page, type: Integer, desc: 'current page no'
|
||||||
|
end
|
||||||
|
get do
|
||||||
|
per_page_option = params[:per_page_count] || 10
|
||||||
|
page_no = params[:page] || 1
|
||||||
|
@courses_all = Course.active.visible.
|
||||||
|
joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
|
||||||
|
@course_count = @courses_all.count
|
||||||
|
@course_pages = Redmine::Pagination::Paginator.new @course_count, per_page_option,page_no
|
||||||
|
@course_activity_count=Hash.new
|
||||||
|
@courses_all.each do |course|
|
||||||
|
@course_activity_count[course.id]=0
|
||||||
|
end
|
||||||
|
@courses = @courses_all.order("created_at desc")
|
||||||
|
@s_type = 0
|
||||||
|
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
|
||||||
|
# @course_activity_count=get_course_activity @courses, @course_activity_count
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Return a course"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
end
|
||||||
|
route_param :id do
|
||||||
|
get do
|
||||||
|
Course.find(params[:id])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
module Mobile
|
||||||
|
class Users < Grape::API
|
||||||
|
resource :users do
|
||||||
|
desc "get all users"
|
||||||
|
get do
|
||||||
|
['hello']
|
||||||
|
end
|
||||||
|
desc "add a user"
|
||||||
|
params do
|
||||||
|
requires :login, type: String, desc: 'username'
|
||||||
|
requires :email, type: String, desc: 'email'
|
||||||
|
requires :password, type: String, desc: 'password'
|
||||||
|
end
|
||||||
|
post do
|
||||||
|
user = User.new
|
||||||
|
user.login = params[:login]
|
||||||
|
user.mail = params[:email]
|
||||||
|
user.password = params[:password]
|
||||||
|
user.password_confirmation = params[:password]
|
||||||
|
user.activate
|
||||||
|
if user.save!
|
||||||
|
UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
|
||||||
|
end
|
||||||
|
user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
class ApiKey < ActiveRecord::Base
|
||||||
|
attr_accessible :access_token, :active, :expires_at, :user_id
|
||||||
|
before_create :generate_access_token
|
||||||
|
before_create :set_experation
|
||||||
|
|
||||||
|
# validates_presence_of :user_id, :access_token
|
||||||
|
|
||||||
|
def expired?
|
||||||
|
DateTime.now >= self.expires_at
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def generate_access_token
|
||||||
|
self.access_token = SecureRandom.hex
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_experation
|
||||||
|
self.expires_at = DateTime.now + 30
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,14 @@
|
|||||||
|
class CreateApiKeys < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :api_keys do |t|
|
||||||
|
t.string :access_token
|
||||||
|
t.datetime :expires_at
|
||||||
|
t.integer :user_id
|
||||||
|
t.boolean :active, default: true
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
add_index :api_keys, :user_id
|
||||||
|
add_index :api_keys, :access_token
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue