SpaController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Cache;
  5. use DB;
  6. use League\CommonMark\CommonMarkConverter;
  7. use App\Services\AccountService;
  8. use App\Services\StatusService;
  9. use App\Services\SnowflakeService;
  10. use App\Util\Localization\Localization;
  11. class SpaController extends Controller
  12. {
  13. public function index(Request $req)
  14. {
  15. abort_unless(config('exp.spa'), 404);
  16. if(!$req->user()) { return redirect('/login'); }
  17. return view('layouts.spa');
  18. }
  19. public function webPost(Request $request, $id)
  20. {
  21. abort_unless(config('exp.spa'), 404);
  22. if($request->user()) {
  23. return view('layouts.spa');
  24. }
  25. $post = StatusService::get($id);
  26. if(
  27. $post &&
  28. isset($post['url']) &&
  29. isset($post['local']) &&
  30. $post['local'] === true
  31. ) {
  32. return redirect($post['url']);
  33. }
  34. return redirect('/login');
  35. }
  36. public function webProfile(Request $request, $id)
  37. {
  38. abort_unless(config('exp.spa'), 404);
  39. if($request->user()) {
  40. if(substr($id, 0, 1) == '@') {
  41. $id = AccountService::usernameToId(substr($id, 1));
  42. return redirect("/i/web/profile/{$id}");
  43. }
  44. return view('layouts.spa');
  45. }
  46. $account = AccountService::get($id);
  47. if($account && isset($account['url']) && $account['local']) {
  48. return redirect($account['url']);
  49. }
  50. return redirect('/login');
  51. }
  52. public function updateLanguage(Request $request)
  53. {
  54. abort_unless(config('exp.spa'), 404);
  55. abort_unless($request->user(), 404);
  56. $this->validate($request, [
  57. 'v' => 'required|in:0.1,0.2',
  58. 'l' => 'required|alpha_dash|max:5'
  59. ]);
  60. $lang = $request->input('l');
  61. $user = $request->user();
  62. abort_if(!in_array($lang, Localization::languages()), 400);
  63. $user->language = $lang;
  64. $user->save();
  65. session()->put('locale', $lang);
  66. return ['language' => $lang];
  67. }
  68. public function getPrivacy()
  69. {
  70. abort_unless($req->user(), 404);
  71. $body = $this->markdownToHtml('views/page/privacy.md');
  72. return [
  73. 'body' => $body
  74. ];
  75. }
  76. public function getTerms()
  77. {
  78. abort_unless($req->user(), 404);
  79. $body = $this->markdownToHtml('views/page/terms.md');
  80. return [
  81. 'body' => $body
  82. ];
  83. }
  84. protected function markdownToHtml($src, $ttl = 600)
  85. {
  86. return Cache::remember(
  87. 'pf:doc_cache:markdown:' . $src,
  88. $ttl,
  89. function() use($src) {
  90. $path = resource_path($src);
  91. $file = file_get_contents($path);
  92. $converter = new CommonMarkConverter();
  93. return (string) $converter->convertToHtml($file);
  94. });
  95. }
  96. public function usernameRedirect(Request $request, $username)
  97. {
  98. abort_unless($request->user(), 404);
  99. $id = AccountService::usernameToId($username);
  100. if(!$id) {
  101. return redirect('/i/web/404');
  102. }
  103. return redirect('/i/web/profile/' . $id);
  104. }
  105. public function hashtagRedirect(Request $request, $tag)
  106. {
  107. if(!$request->user()) {
  108. return redirect('/discover/tags/' . $tag);
  109. }
  110. return view('layouts.spa');
  111. }
  112. }