Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add dingo/api component and jwt-auth component #23

Open
wants to merge 20 commits into
base: dev-website
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,10 @@ QINIU_ACCESS_KEY=crjCbpNCWQvndESnBCMDxWdbIvLyEFn81Sh1CS3t
QINIU_SECRET_KEY=devdUJ5y3e-OzcQHtCM7kUESHd_vQxKKBXuMUnvX
QINIU_BUCKET=heycommunity-public
QINIU_NOTIFY_URL=null

##
## Dingo API
API_STANDARDS_TREE=vnd
API_SUBTYPE=heycommunity
API_VERSION=v1
API_PREFIX=api
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ Homestead.yaml
Homestead.json
.env
.idea

/public/bower-assets
.DS_Store
20 changes: 20 additions & 0 deletions app/Http/Controllers/Api/Transform/TimelineTransform.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Api\Transform;

use App\Timeline;
use League\Fractal\TransformerAbstract;

class TimelineTransform extends TransformerAbstract
{
public function transform(Timeline $timeline)
{
// add what you need here
return [
'content' => $timeline->content,
'imgs' => $timeline->imgs,
'like_num' => $timeline->like_num,
'view_num' => $timeline->view_num,
'is_like' => $timeline->is_like,
];
}
}
18 changes: 18 additions & 0 deletions app/Http/Controllers/Api/Transform/UserTransform.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace App\Http\Controllers\Api\Transform;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransform extends TransformerAbstract
{
public function transform(User $user)
{
// add what you need here
return [
'nickname' => $user->nickname,
'phone' => $user->phone,
];
}
}
96 changes: 96 additions & 0 deletions app/Http/Controllers/Api/V1/AuthController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;
use App\User;
use App\Http\Controllers\Controller;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use App\Http\Controllers\Api\Transform\UserTransform;

/**
* @Resource("User", uri="/auth")
*/
class AuthController extends BaseController
{
/**
* Get the auth code.
*
* Get a auth code.
*
* @Get("/login")
* @Versions({"v1"})
* @Transaction({
* @Request({"phone": "your phone number", "password": "your password"}),
* @Response(200, body={"token": "your token"}),
* })
*
* @param \Illuminate\Http\Request $request
* @return json
*/
public function authentication(Request $request)
{
$credentials = $request->only('phone', 'password');
try {
// attempt to verify the credentials and create a token for the user
if (! $token = JWTAuth::attempt($credentials)) {
return $this->response->error('invalid_credentials', 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return $this->response->error('could_not_create_token', 500);
}
// all good so return the token
$data = [
'data' => [
'token' => $token
]
];
return $this->response->array($data);
}

/**
* Get authed user.
*
* Get authed user info.
*
* @Get("/user")
* @Versions({"v1"})
* @Transaction({
* @Request({"token": "your token"}),
* @Response(200, body={"data": {}}),
* @Response(500, body={"message": "boo", "status_code": 500})
* })
*
* @param \Illuminate\Http\Request $request
* @return json
*/
public function getAuthenticatedUser()
{
try {

if (! $user = JWTAuth::parseToken()->authenticate()) {
return $this->response->errorNotFound('user_not_found');
}

} catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

return $this->response->error('token_expired', $e->getStatusCode());

} catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

return $this->response->error('token_invalid', $e->getStatusCode());

} catch (Tymon\JWTAuth\Exceptions\JWTException $e) {

return $this->response->error('token_absent', $e->getStatusCode());

}

// the token is valid and we have found the user via the sub claim
return $this->response
->item($user, new UserTransform)
->setStatusCode(200);
}
}
14 changes: 14 additions & 0 deletions app/Http/Controllers/Api/V1/BaseController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Dingo\Api\Routing\Helpers;

class BaseController extends Controller
{
use Helpers;
}
110 changes: 110 additions & 0 deletions app/Http/Controllers/Api/V1/TimelineController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php

namespace App\Http\Controllers\Api\V1;

use FFMpeg\FFMpeg;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

use Storage;
use Thumbnail;
use App\Timeline;
use App\TimelineLike;
use App\TimelineImg;
use App\TimelineVideo;
use App\TimelineComment;
use App\Notice;
use App\Events\TriggerNoticeEvent;
use App\Http\Controllers\Api\Transform\TimelineTransform;

/**
* @Resource("Timeline", uri="/timelines")
*/
class TimelineController extends BaseController
{
/**
* The construct
*
* @return void
*/
public function __construct()
{
$this->middleware('jwt.auth', ['only'=>[]]);
}

/**
* Show all timelines.
*
* Get a JSON representation of all the timelines.
*
* @Get("/")
* @Versions({"v1"})
* @Transaction({
* @Request({"token": "foo"}),
* @Response(200, body={"data": []}),
* })
*
* @param \Illuminate\Http\Request $request
* @return object The all timelines
*/
public function index(Request $request)
{
$query = Timeline::with(['author', 'author_like', 'comments'])
->orderBy('id', 'desc')
->orderBy('created_at', 'desc')
->limit(10);

if ($request->type === 'refresh') {
$query->where('id', '>', $request->id);
} else if ($request->type === 'infinite') {
$query->where('id', '<', $request->id);
}

$user = $this->auth->user();

$timelines = $query->get()->each(function($item, $key) use ($user) {
if (!$user) {
$item->is_like = false;
} else {
$item->is_like = TimelineLike::where([
'timeline_id' => $item->id,
'user_id' => $user->id
])->exists() ? true : false;
}
if ($item->imgs) {
$item->imgs = TimelineImg::getImgs($item->imgs);
}
});

return $this->response
->collection($timelines, new TimelineTransform)
->setStatusCode(200);
}

/**
* Get one of the resource according $id.
*
* @Get("/{id}")
* @Versions({"v1"})
* @Transaction({
* @Response(200, body={"data": {}}),
* @Response(404, body={"message":"Not Found","status_code":404})
* })
* @param \Illuminate\Http\Request $request
* @param int $id
* @return object The timeline
*/
public function show(Request $request, $id)
{
$timeline = Timeline::where('id', $id)
->first();
if ($timeline) {
return $this->response
->item($timeline, new TimelineTransform)
->setStatusCode(200);
} else {
return $this->errorNotFound();
}
}
}
2 changes: 2 additions & 0 deletions app/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,7 @@ class Kernel extends HttpKernel
'auth.admin' => \App\Http\Middleware\AuthenticateAdmin::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
];
}
41 changes: 41 additions & 0 deletions app/Http/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,46 @@
Route::controller('topic', 'TopicController');
Route::controller('activity', 'ActivityController');
Route::controller('timeline', 'TimelineController');

Route::controller('user', 'UserController');
Route::controller('ucenter', 'UserCenterController');

//
// Dingo Api
// ----------------------------
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
$api->group(['namespace' => 'App\Http\Controllers\Api'], function ($api) {
// auth
$api->post(
'auth/login',
[
'as' => 'auth.authentication',
'uses' => 'V1\AuthController@authentication'
]
);
// user
$api->get(
'auth/user',
[
'as' => 'auth.user',
'uses' => 'V1\AuthController@getAuthenticatedUser'
]
);
// timeline
$api->get(
'timelines',
[
'as' => 'timelines.index',
'uses' => 'V1\TimelineController@index'
]
);
$api->get(
'timelines/{id}',
[
'as' => 'timelines.show',
'uses' => 'V1\TimelineController@show'
]
);
});
});
54 changes: 54 additions & 0 deletions app/Providers/JwtAuthAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace App\Providers;

use Tymon\JWTAuth\Providers\Auth\AuthInterface;
use Auth;

class JwtAuthAdapter implements AuthInterface
{
/**
* @var \Auth
*/
protected $auth;

/**
* @param \Auth $auth
*/
public function __construct()
{
$this->auth = Auth::user();
}

/**
* Check a user's credentials.
*
* @param array $credentials
* @return bool
*/
public function byCredentials(array $credentials = [])
{
return $this->auth->once($credentials);
}

/**
* Authenticate a user via the id.
*
* @param mixed $id
* @return bool
*/
public function byId($id)
{
return $this->auth->onceUsingId($id);
}

/**
* Get the currently authenticated user.
*
* @return mixed
*/
public function user()
{
return $this->auth->user();
}
}
Loading