SpaController.php 2.5 KB

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