PortfolioController.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Models\Portfolio;
  5. use Cache;
  6. use DB;
  7. use App\Status;
  8. use App\User;
  9. use App\Services\AccountService;
  10. use App\Services\StatusService;
  11. class PortfolioController extends Controller
  12. {
  13. public function index(Request $request)
  14. {
  15. return view('portfolio.index');
  16. }
  17. public function show(Request $request, $username)
  18. {
  19. $user = User::whereUsername($username)->first();
  20. if(!$user) {
  21. return view('portfolio.404');
  22. }
  23. $portfolio = Portfolio::whereUserId($user->id)->firstOrFail();
  24. $user = AccountService::get($user->profile_id);
  25. if($user['locked']) {
  26. return view('portfolio.404');
  27. }
  28. if($portfolio->active != true) {
  29. if(!$request->user()) {
  30. return view('portfolio.404');
  31. }
  32. if($request->user()->profile_id == $user['id']) {
  33. return redirect(config('portfolio.path') . '/settings');
  34. }
  35. return view('portfolio.404');
  36. }
  37. return view('portfolio.show', compact('user', 'portfolio'));
  38. }
  39. public function showPost(Request $request, $username, $id)
  40. {
  41. $authed = $request->user();
  42. $post = StatusService::get($id);
  43. if(!$post) {
  44. return view('portfolio.404');
  45. }
  46. $user = AccountService::get($post['account']['id']);
  47. $portfolio = Portfolio::whereProfileId($user['id'])->first();
  48. if($user['locked'] || $portfolio->active != true) {
  49. return view('portfolio.404');
  50. }
  51. if(!$post || $post['visibility'] != 'public' || $post['pf_type'] != 'photo' || $user['id'] != $post['account']['id']) {
  52. return view('portfolio.404');
  53. }
  54. return view('portfolio.show_post', compact('user', 'post', 'authed'));
  55. }
  56. public function myRedirect(Request $request)
  57. {
  58. abort_if(!$request->user(), 404);
  59. $user = $request->user();
  60. if(Portfolio::whereProfileId($user->profile_id)->exists() === false) {
  61. $portfolio = new Portfolio;
  62. $portfolio->profile_id = $user->profile_id;
  63. $portfolio->user_id = $user->id;
  64. $portfolio->active = false;
  65. $portfolio->save();
  66. }
  67. $domain = config('portfolio.domain');
  68. $path = config('portfolio.path');
  69. $url = 'https://' . $domain . $path;
  70. return redirect($url);
  71. }
  72. public function settings(Request $request)
  73. {
  74. if(!$request->user()) {
  75. return redirect(route('home'));
  76. }
  77. $portfolio = Portfolio::whereUserId($request->user()->id)->first();
  78. if(!$portfolio) {
  79. $portfolio = new Portfolio;
  80. $portfolio->user_id = $request->user()->id;
  81. $portfolio->profile_id = $request->user()->profile_id;
  82. $portfolio->save();
  83. }
  84. return view('portfolio.settings', compact('portfolio'));
  85. }
  86. public function store(Request $request)
  87. {
  88. abort_unless($request->user(), 404);
  89. $this->validate($request, [
  90. 'profile_source' => 'required|in:recent,custom',
  91. 'layout' => 'required|in:grid,masonry',
  92. 'layout_container' => 'required|in:fixed,fluid'
  93. ]);
  94. $portfolio = Portfolio::whereUserId($request->user()->id)->first();
  95. if(!$portfolio) {
  96. $portfolio = new Portfolio;
  97. $portfolio->user_id = $request->user()->id;
  98. $portfolio->profile_id = $request->user()->profile_id;
  99. $portfolio->save();
  100. }
  101. $portfolio->active = $request->input('enabled') === 'on';
  102. $portfolio->show_captions = $request->input('show_captions') === 'on';
  103. $portfolio->show_license = $request->input('show_license') === 'on';
  104. $portfolio->show_location = $request->input('show_location') === 'on';
  105. $portfolio->show_timestamp = $request->input('show_timestamp') === 'on';
  106. $portfolio->show_link = $request->input('show_link') === 'on';
  107. $portfolio->profile_source = $request->input('profile_source');
  108. $portfolio->show_avatar = $request->input('show_avatar') === 'on';
  109. $portfolio->show_bio = $request->input('show_bio') === 'on';
  110. $portfolio->profile_layout = $request->input('layout');
  111. $portfolio->profile_container = $request->input('layout_container');
  112. $portfolio->save();
  113. return redirect('/' . $request->user()->username);
  114. }
  115. public function getFeed(Request $request, $id)
  116. {
  117. $user = AccountService::get($id, true);
  118. if(!$user || !isset($user['id'])) {
  119. return response()->json([], 404);
  120. }
  121. $portfolio = Portfolio::whereProfileId($user['id'])->first();
  122. if(!$portfolio || !$portfolio->active) {
  123. return response()->json([], 404);
  124. }
  125. if($portfolio->profile_source === 'custom' && $portfolio->metadata) {
  126. return $this->getCustomFeed($portfolio);
  127. }
  128. return $this->getRecentFeed($user['id']);
  129. }
  130. protected function getCustomFeed($portfolio) {
  131. if(!$portfolio->metadata['posts']) {
  132. return response()->json([], 400);
  133. }
  134. return collect($portfolio->metadata['posts'])->map(function($p) {
  135. return StatusService::get($p);
  136. })
  137. ->filter(function($p) {
  138. return $p && isset($p['account']);
  139. })->values();
  140. }
  141. protected function getRecentFeed($id) {
  142. $media = Cache::remember('portfolio:recent-feed:' . $id, 3600, function() use($id) {
  143. return DB::table('media')
  144. ->whereProfileId($id)
  145. ->whereNotNull('status_id')
  146. ->groupBy('status_id')
  147. ->orderByDesc('id')
  148. ->take(50)
  149. ->pluck('status_id');
  150. });
  151. return $media->map(function($sid) use($id) {
  152. return StatusService::get($sid);
  153. })
  154. ->filter(function($post) {
  155. return $post &&
  156. isset($post['media_attachments']) &&
  157. !empty($post['media_attachments']) &&
  158. $post['pf_type'] === 'photo' &&
  159. $post['visibility'] === 'public';
  160. })
  161. ->take(24)
  162. ->values();
  163. }
  164. public function getSettings(Request $request)
  165. {
  166. abort_if(!$request->user(), 403);
  167. $res = Portfolio::whereUserId($request->user()->id)->get();
  168. if(!$res) {
  169. return [];
  170. }
  171. return $res->map(function($p) {
  172. return [
  173. 'url' => $p->url(),
  174. 'pid' => (string) $p->profile_id,
  175. 'active' => (bool) $p->active,
  176. 'show_captions' => (bool) $p->show_captions,
  177. 'show_license' => (bool) $p->show_license,
  178. 'show_location' => (bool) $p->show_location,
  179. 'show_timestamp' => (bool) $p->show_timestamp,
  180. 'show_link' => (bool) $p->show_link,
  181. 'show_avatar' => (bool) $p->show_avatar,
  182. 'show_bio' => (bool) $p->show_bio,
  183. 'profile_layout' => $p->profile_layout,
  184. 'profile_source' => $p->profile_source,
  185. 'metadata' => $p->metadata
  186. ];
  187. })->first();
  188. }
  189. public function getAccountSettings(Request $request)
  190. {
  191. $this->validate($request, [
  192. 'id' => 'required|integer'
  193. ]);
  194. $account = AccountService::get($request->input('id'));
  195. abort_if(!$account, 404);
  196. $p = Portfolio::whereProfileId($request->input('id'))->whereActive(1)->firstOrFail();
  197. if(!$p) {
  198. return [];
  199. }
  200. return [
  201. 'url' => $p->url(),
  202. 'show_captions' => (bool) $p->show_captions,
  203. 'show_license' => (bool) $p->show_license,
  204. 'show_location' => (bool) $p->show_location,
  205. 'show_timestamp' => (bool) $p->show_timestamp,
  206. 'show_link' => (bool) $p->show_link,
  207. 'show_avatar' => (bool) $p->show_avatar,
  208. 'show_bio' => (bool) $p->show_bio,
  209. 'profile_layout' => $p->profile_layout,
  210. 'profile_source' => $p->profile_source
  211. ];
  212. }
  213. public function storeSettings(Request $request)
  214. {
  215. abort_if(!$request->user(), 403);
  216. $this->validate($request, [
  217. 'profile_layout' => 'sometimes|in:grid,masonry,album'
  218. ]);
  219. $res = Portfolio::whereUserId($request->user()->id)
  220. ->update($request->only([
  221. 'active',
  222. 'show_captions',
  223. 'show_license',
  224. 'show_location',
  225. 'show_timestamp',
  226. 'show_link',
  227. 'show_avatar',
  228. 'show_bio',
  229. 'profile_layout',
  230. 'profile_source'
  231. ]));
  232. Cache::forget('portfolio:recent-feed:' . $request->user()->profile_id);
  233. return 200;
  234. }
  235. public function storeCurated(Request $request)
  236. {
  237. abort_if(!$request->user(), 403);
  238. $this->validate($request, [
  239. 'ids' => 'required|array|max:24'
  240. ]);
  241. $pid = $request->user()->profile_id;
  242. $ids = $request->input('ids');
  243. Status::whereProfileId($pid)
  244. ->whereScope('public')
  245. ->whereIn('type', ['photo', 'photo:album'])
  246. ->findOrFail($ids);
  247. $p = Portfolio::whereProfileId($pid)->firstOrFail();
  248. $p->metadata = ['posts' => $ids];
  249. $p->save();
  250. Cache::forget('portfolio:recent-feed:' . $pid);
  251. return $request->ids;
  252. }
  253. }