VoucherController.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Voucher;
  5. use Illuminate\Contracts\Pagination\LengthAwarePaginator;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Http\Response;
  9. use Illuminate\Validation\Rule;
  10. use Spatie\QueryBuilder\QueryBuilder;
  11. class VoucherController extends Controller
  12. {
  13. const ALLOWED_INCLUDES = ['users'];
  14. const ALLOWED_FILTERS = ['code', 'memo', 'credits', 'uses'];
  15. /**
  16. * Display a listing of the resource.
  17. *
  18. * @return LengthAwarePaginator
  19. */
  20. public function index(Request $request)
  21. {
  22. $query = QueryBuilder::for(Voucher::class)
  23. ->allowedIncludes(self::ALLOWED_INCLUDES)
  24. ->allowedFilters(self::ALLOWED_FILTERS);
  25. return $query->paginate($request->input('per_page') ?? 50);
  26. }
  27. /**
  28. * Show the form for creating a new resource.
  29. *
  30. * @return Response
  31. */
  32. public function create()
  33. {
  34. //
  35. }
  36. /**
  37. * Store a newly created resource in storage.
  38. *
  39. * @param Request $request
  40. * @return Response
  41. */
  42. public function store(Request $request)
  43. {
  44. $request->validate([
  45. 'memo' => 'nullable|string|max:191',
  46. 'code' => 'required|string|alpha_dash|max:36|min:4|unique:vouchers',
  47. 'uses' => 'required|numeric|max:2147483647|min:1',
  48. 'credits' => 'required|numeric|between:0,99999999',
  49. 'expires_at' => 'nullable|multiple_date_format:d-m-Y H:i:s,d-m-Y|after:now|before:10 years'
  50. ]);
  51. return Voucher::create($request->all());
  52. }
  53. /**
  54. * Display the specified resource.
  55. *
  56. * @param int $id
  57. * @return Collection|Voucher
  58. */
  59. public function show(int $id)
  60. {
  61. $query = QueryBuilder::for(Voucher::class)
  62. ->where('id', '=', $id)
  63. ->allowedIncludes(self::ALLOWED_INCLUDES);
  64. return $query->get();
  65. }
  66. /**
  67. * Show the form for editing the specified resource.
  68. *
  69. * @param int $id
  70. * @return Response
  71. */
  72. public function edit($id)
  73. {
  74. //
  75. }
  76. /**
  77. * Update the specified resource in storage.
  78. *
  79. * @param Request $request
  80. * @param int $id
  81. * @return Response
  82. */
  83. public function update(Request $request, int $id)
  84. {
  85. $voucher = Voucher::findOrFail($id);
  86. $request->validate([
  87. 'memo' => 'nullable|string|max:191',
  88. 'code' => "required|string|alpha_dash|max:36|min:4|unique:vouchers,code,{$voucher->id}",
  89. 'uses' => 'required|numeric|max:2147483647|min:1',
  90. 'credits' => 'required|numeric|between:0,99999999',
  91. 'expires_at' => 'nullable|multiple_date_format:d-m-Y H:i:s,d-m-Y|after:now|before:10 years'
  92. ]);
  93. $voucher->update($request->all());
  94. return $voucher;
  95. }
  96. /**
  97. * Remove the specified resource from storage.
  98. *
  99. * @param int $id
  100. * @return Response
  101. */
  102. public function destroy(int $id)
  103. {
  104. $voucher = Voucher::findOrFail($id);
  105. $voucher->delete();
  106. return $voucher;
  107. }
  108. /**
  109. * get linked users
  110. * @param Request $request
  111. * @param Voucher $voucher
  112. * @return LengthAwarePaginator
  113. */
  114. public function users(Request $request, Voucher $voucher)
  115. {
  116. $request->validate([
  117. 'include' => [
  118. 'nullable',
  119. 'string',
  120. Rule::in(['discorduser']),
  121. ]
  122. ]);
  123. if ($request->input('include') == 'discorduser') {
  124. return $voucher->users()->with('discordUser')->paginate($request->query('per_page') ?? 50);
  125. }
  126. return $voucher->users()->paginate($request->query('per_page') ?? 50);
  127. }
  128. }