diff --git a/api/app/Http/Controllers/Forms/TemplateController.php b/api/app/Http/Controllers/Forms/TemplateController.php index c368ccb3..584a2f2f 100644 --- a/api/app/Http/Controllers/Forms/TemplateController.php +++ b/api/app/Http/Controllers/Forms/TemplateController.php @@ -7,10 +7,34 @@ use App\Http\Resources\FormTemplateResource; use App\Models\Template; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Http; use App\Http\Controllers\Controller; class TemplateController extends Controller { + private function getProdTemplates($slug = false) + { + if (!config('app.self_hosted')) { + return []; + } + + $prodTemplates = \Cache::remember('prod_templates', 3600, function () { + $response = Http::get('https://api.opnform.com/templates'); + if ($response->successful()) { + return collect($response->json())->map(function ($item) { + $item['from_prod'] = true; + return $item; + })->toArray(); + } + }); + if ($slug) { + return collect($prodTemplates)->filter(function ($item) use ($slug) { + return $item['slug'] === $slug; + })->toArray(); + } + return $prodTemplates; + } + public function index(Request $request) { $limit = (int) $request->get('limit', 0); @@ -37,7 +61,10 @@ class TemplateController extends Controller $templates = $query->orderByDesc('created_at')->get(); - return FormTemplateResource::collection($templates); + return response()->json(array_merge( + FormTemplateResource::collection($templates)->toArray($request), + $this->getProdTemplates() + )); } public function create(FormTemplateRequest $request) @@ -83,8 +110,7 @@ class TemplateController extends Controller public function show(string $slug) { - return new FormTemplateResource( - Template::whereSlug($slug)->firstOrFail() - ); + $template = Template::whereSlug($slug)->first(); + return ($template) ? new FormTemplateResource($template) : $this->getProdTemplates($slug); } } diff --git a/client/pages/templates/[slug].vue b/client/pages/templates/[slug].vue index 0ae1c615..1a9690d0 100644 --- a/client/pages/templates/[slug].vue +++ b/client/pages/templates/[slug].vue @@ -334,6 +334,7 @@ const canEditTemplate = computed( () => authStore.check && template.value && + template.value?.from_prod !== true && (authStore.user.admin || authStore.user.template_editor || template.value.creator_id === authStore.user.id),