resolver = $resolver; $this->formatter = $formatter; } public function show(Request $request) { $request->validate([ 'url:required|url' ]); $url = $this->formatter->normalizeUrl($request->input('url')); $metadata = Metadata::find($url); if ($metadata === null || ($metadata->expires_at !== null && $metadata->expires_at < now())) { $resolved = $this->resolver->resolve($url); $metadata = Metadata::updateOrCreate(['url' => $url], [ 'title' => $resolved->title, 'description' => $resolved->description, 'image' => $resolved->image, 'expires_at' => $resolved->expires_at ]); $tagIds = []; foreach ($resolved->normalizedTags() as $tagName) { $tag = Tag::firstOrCreate(['name' => $tagName]); $tagIds[] = $tag->id; } $metadata->tags()->sync($tagIds); } $metadata->load('tags'); $response = response($metadata); if (!config('app.debug')) { $response = $response->setCache(['public' => true, 'max_age' => 86400]); } return $response; } }