TransferController.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Transfer;
  4. use App\Models\Channel;
  5. use App\Models\Article;
  6. use Illuminate\Http\Request;
  7. use App\Http\Api\AuthApi;
  8. use App\Http\Api\StudioApi;
  9. use App\Http\Api\UserApi;
  10. use App\Http\Resources\TransferResource;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. class TransferController extends Controller
  14. {
  15. /**
  16. * Display a listing of the resource.
  17. *
  18. * @return \Illuminate\Http\Response
  19. */
  20. public function index(Request $request)
  21. {
  22. switch ($request->get('view')) {
  23. case 'studio':
  24. # 获取studio内所有channel
  25. $user = AuthApi::current($request);
  26. if(!$user){
  27. return $this->error(__('auth.failed'));
  28. }
  29. //判断当前用户是否有指定的studio的管理权限
  30. $studioId = StudioApi::getIdByName($request->get('name'));
  31. if($user['user_uid'] !== $studioId){
  32. return $this->error(__('auth.failed'));
  33. }
  34. switch ($request->get('view2')) {
  35. case 'in':
  36. $table = Transfer::where('new_owner',$studioId);
  37. break;
  38. case 'out':
  39. $table = Transfer::where('origin_owner',$studioId);
  40. break;
  41. default:
  42. return $this->error('no view2');
  43. break;
  44. }
  45. $outNumber = Transfer::where('origin_owner',$studioId)
  46. ->where('status','transferred')
  47. ->count();
  48. $inNumber = Transfer::where('new_owner',$studioId)
  49. ->where('status','transferred')
  50. ->count();
  51. break;
  52. }
  53. if(!empty($search)){
  54. $table->where('title', 'like', $search."%");
  55. }
  56. $table->orderBy($request->get('order','updated_at'),
  57. $request->get('dir','desc'));
  58. $count = $table->count();
  59. $table->skip($request->get("offset",0))
  60. ->take($request->get('limit',100));
  61. $result = $table->get();
  62. return $this->ok(["rows"=>TransferResource::collection($result),
  63. "count"=>$count,
  64. 'out'=>$outNumber,
  65. 'in'=>$inNumber,
  66. ]);
  67. }
  68. /**
  69. * Store a newly created resource in storage.
  70. *
  71. * @param \Illuminate\Http\Request $request
  72. * @return \Illuminate\Http\Response
  73. */
  74. public function store(Request $request)
  75. {
  76. $user = AuthApi::current($request);
  77. if(!$user){
  78. return $this->error(__('auth.failed'));
  79. }
  80. //
  81. // validate
  82. // read more on validation at http://laravel.com/docs/validation
  83. $rules = array(
  84. 'res_id' => 'required',
  85. 'res_type' => 'required',
  86. 'new_owner' => 'required',
  87. );
  88. $validated = $request->validate($rules);
  89. $resId = $request->get('res_id');
  90. foreach ($resId as $id) {
  91. $transfer = new Transfer;
  92. //查看权限
  93. switch ($request->get('res_type')) {
  94. case 'channel':
  95. $oldRes = Channel::find($id);
  96. if($oldRes->owner_uid !== $user['user_uid']){
  97. return $this->error(__('auth.failed'),[403],403);
  98. }
  99. $transfer->origin_owner = $oldRes->owner_uid;
  100. break;
  101. case 'article':
  102. $oldRes = Article::find($id);
  103. if($oldRes->owner !== $user['user_uid']){
  104. return $this->error(__('auth.failed'),[403],403);
  105. }
  106. $transfer->origin_owner = $oldRes->owner;
  107. break;
  108. default:
  109. # code...
  110. break;
  111. }
  112. //查重
  113. if(Transfer::where('res_id',$id)
  114. ->where('res_type',$request->get('res_type'))
  115. ->where('status','transferred')
  116. ->exists()){
  117. return $this->error('该资源已经进入转让流程',[200],200);
  118. }
  119. $transfer->res_id = $id;
  120. $transfer->res_type = $request->get('res_type');
  121. $transfer->transferor_id = $user['user_uid'];
  122. $transfer->new_owner = $request->get('new_owner');
  123. $transfer->save();
  124. }
  125. return $this->ok(count($resId));
  126. }
  127. /**
  128. * Display the specified resource.
  129. *
  130. * @param \App\Models\Transfer $transfer
  131. * @return \Illuminate\Http\Response
  132. */
  133. public function show(Transfer $transfer)
  134. {
  135. //
  136. return $this->ok(new TransferResource($discussion));
  137. }
  138. /**
  139. * Update the specified resource in storage.
  140. *
  141. * @param \Illuminate\Http\Request $request
  142. * @param \App\Models\Transfer $transfer
  143. * @return \Illuminate\Http\Response
  144. */
  145. public function update(Request $request, Transfer $transfer)
  146. {
  147. $user = AuthApi::current($request);
  148. if(!$user){
  149. return $this->error(__('auth.failed'),[403],403);
  150. }
  151. //权限
  152. switch ($request->get('status')) {
  153. case 'accept':
  154. case 'refuse':
  155. if($transfer->new_owner!==$user['user_uid']){
  156. return $this->error(__('auth.failed'),[403],403);
  157. }
  158. $transfer->status = $request->get('status');
  159. break;
  160. case 'cancel':
  161. if($transfer->origin_owner!==$user['user_uid']){
  162. return $this->error(__('auth.failed'),[403],403);
  163. }
  164. $transfer->status = 'cancel';
  165. break;
  166. default:
  167. return $this->error(__('auth.failed'),[404],404);
  168. break;
  169. }
  170. try{
  171. DB::transaction(function () use ($transfer,$request,$user) {
  172. $transfer->editor_id = $user['user_uid'];
  173. $transfer->save();
  174. if($request->get('status')==='accept'){
  175. $newOwner = UserApi::getByUuid($transfer->new_owner);
  176. $isBasic = false;
  177. if(isset($newOwner['roles']) && is_array($newOwner['roles'])){
  178. $isBasic = in_array('basic',$newOwner['roles']);
  179. }
  180. switch ($transfer->res_type) {
  181. case 'channel':
  182. $newData = ['owner_uid'=>$transfer->new_owner];
  183. if($isBasic){
  184. $newData['status'] = 5;
  185. }
  186. Channel::where('uid',$transfer->res_id)
  187. ->update($newData);
  188. break;
  189. case 'article':
  190. $userId = UserApi::getIdByUuid($transfer->new_owner);
  191. $newData = ['owner'=>$transfer->new_owner,'owner_id'=>$userId] ;
  192. if($isBasic){
  193. $newData['status'] = 10;
  194. }
  195. Article::where('uid',$transfer->res_id)
  196. ->update($newData);
  197. break;
  198. default:
  199. # code...
  200. break;
  201. }
  202. }
  203. });
  204. }catch(\Exception $e){
  205. Log::error('update.fail',['error'=>$e]);
  206. return $this->error('update.fail',['message'=>$e],500);
  207. }
  208. return $this->ok(new TransferResource($transfer));
  209. }
  210. /**
  211. * Remove the specified resource from storage.
  212. *
  213. * @param \App\Models\Transfer $transfer
  214. * @return \Illuminate\Http\Response
  215. */
  216. public function destroy(Transfer $transfer)
  217. {
  218. //
  219. }
  220. }