Lint PHP code psr-12, add GH action

This commit is contained in:
Julien Nahum
2024-02-23 11:54:12 +01:00
parent e85e4df7fe
commit 62971a2ef4
226 changed files with 2338 additions and 2144 deletions

View File

@@ -5,8 +5,6 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Forms\Form;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ImpersonationController extends Controller
{
@@ -15,7 +13,8 @@ class ImpersonationController extends Controller
$this->middleware('moderator');
}
public function impersonate($identifier) {
public function impersonate($identifier)
{
$user = null;
if (is_numeric($identifier)) {
$user = User::find($identifier);
@@ -29,17 +28,17 @@ class ImpersonationController extends Controller
}
}
if (!$user) {
if (! $user) {
return $this->error([
'message'=> 'User not found.'
'message' => 'User not found.',
]);
} else if ($user->admin) {
} elseif ($user->admin) {
return $this->error([
'message' => 'You cannot impersonate an admin.',
]);
}
\Log::warning('Impersonation started',[
\Log::warning('Impersonation started', [
'from_id' => auth()->id(),
'from_email' => auth()->user()->email,
'target_id' => $user->id,
@@ -52,7 +51,7 @@ class ImpersonationController extends Controller
])->login($user);
return $this->success([
'token' => $token
'token' => $token,
]);
}
}

View File

@@ -17,14 +17,16 @@ class AppSumoAuthController extends Controller
public function handleCallback(Request $request)
{
if (!$code = $request->code) {
if (! $code = $request->code) {
return response()->json(['message' => 'Healthy'], 200);
}
$accessToken = $this->retrieveAccessToken($code);
$license = $this->fetchOrCreateLicense($accessToken);
// If user connected, attach license
if (Auth::check()) return $this->attachLicense($license);
if (Auth::check()) {
return $this->attachLicense($license);
}
// otherwise start login flow by passing the encrypted license key id
if (is_null($license->user_id)) {
@@ -37,7 +39,7 @@ class AppSumoAuthController extends Controller
private function retrieveAccessToken(string $requestCode): string
{
return Http::withHeaders([
'Content-type' => 'application/json'
'Content-type' => 'application/json',
])->post('https://appsumo.com/openid/token/', [
'grant_type' => 'authorization_code',
'code' => $requestCode,
@@ -50,13 +52,13 @@ class AppSumoAuthController extends Controller
private function fetchOrCreateLicense(string $accessToken): License
{
// Fetch license from API
$licenseKey = Http::get('https://appsumo.com/openid/license_key/?access_token=' . $accessToken)
$licenseKey = Http::get('https://appsumo.com/openid/license_key/?access_token='.$accessToken)
->throw()
->json('license_key');
// Fetch or create license model
$license = License::where('license_provider','appsumo')->where('license_key',$licenseKey)->first();
if (!$license) {
$license = License::where('license_provider', 'appsumo')->where('license_key', $licenseKey)->first();
if (! $license) {
$licenseData = Http::withHeaders([
'X-AppSumo-Licensing-Key' => config('services.appsumo.api_key'),
])->get('https://api.licensing.appsumo.com/v2/licenses/'.$licenseKey)->json();
@@ -73,8 +75,9 @@ class AppSumoAuthController extends Controller
return $license;
}
private function attachLicense(License $license) {
if (!Auth::check()) {
private function attachLicense(License $license)
{
if (! Auth::check()) {
throw new AuthenticationException('User not authenticated');
}
@@ -82,6 +85,7 @@ class AppSumoAuthController extends Controller
if (is_null($license->user_id)) {
$license->user_id = Auth::id();
$license->save();
return redirect(front_url('/home?appsumo_connect=1'));
}
@@ -90,8 +94,6 @@ class AppSumoAuthController extends Controller
}
/**
* @param User $user
* @param string|null $licenseHash
* @return string|null
*
* Returns null if no license found
@@ -100,7 +102,7 @@ class AppSumoAuthController extends Controller
*/
public static function registerWithLicense(User $user, ?string $licenseHash): ?bool
{
if (!$licenseHash) {
if (! $licenseHash) {
return null;
}
$licenseId = decrypt($licenseHash);
@@ -109,6 +111,7 @@ class AppSumoAuthController extends Controller
if ($license && is_null($license->user_id)) {
$license->user_id = $user->id;
$license->save();
return true;
}

View File

@@ -23,7 +23,6 @@ class ForgotPasswordController extends Controller
/**
* Get the response for a successful password reset link.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
@@ -35,7 +34,6 @@ class ForgotPasswordController extends Controller
/**
* Get the response for a failed password reset link.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/

View File

@@ -26,7 +26,6 @@ class LoginController extends Controller
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function attemptLogin(Request $request)
@@ -50,7 +49,6 @@ class LoginController extends Controller
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
@@ -64,7 +62,6 @@ class LoginController extends Controller
/**
* Send the response after the user was authenticated.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
protected function sendLoginResponse(Request $request)
@@ -84,7 +81,6 @@ class LoginController extends Controller
/**
* Get the failed login response instance.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*
* @throws \Illuminate\Validation\ValidationException
@@ -104,7 +100,6 @@ class LoginController extends Controller
/**
* Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)

View File

@@ -28,7 +28,7 @@ class OAuthController extends Controller
/**
* Redirect the user to the provider authentication page.
*
* @param string $provider
* @param string $provider
* @return \Illuminate\Http\RedirectResponse
*/
public function redirect($provider)
@@ -41,7 +41,7 @@ class OAuthController extends Controller
/**
* Obtain the user information from the provider.
*
* @param string $driver
* @param string $driver
* @return \Illuminate\Http\Response
*/
public function handleCallback($provider)
@@ -61,8 +61,8 @@ class OAuthController extends Controller
}
/**
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @return \App\Models\User
*/
protected function findOrCreateUser($provider, $user)
@@ -81,15 +81,15 @@ class OAuthController extends Controller
}
if (User::where('email', $user->getEmail())->exists()) {
throw new EmailTakenException;
throw new EmailTakenException();
}
return $this->createUser($provider, $user);
}
/**
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @return \App\Models\User
*/
protected function createUser($provider, $sUser)

View File

@@ -4,8 +4,8 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Models\Workspace;
use App\Models\User;
use App\Models\Workspace;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;
@@ -31,8 +31,7 @@ class RegisterController extends Controller
/**
* The user has been registered.
*
* @param \Illuminate\Http\Request $request
* @param \App\User $user
* @param \App\User $user
* @return \Illuminate\Http\JsonResponse
*/
protected function registered(Request $request, User $user)
@@ -45,13 +44,13 @@ class RegisterController extends Controller
(new UserResource($user))->toArray($request),
[
'appsumo_license' => $this->appsumoLicense,
]));
]
));
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
@@ -64,14 +63,13 @@ class RegisterController extends Controller
'agree_terms' => ['required', Rule::in([true])],
'appsumo_license' => ['nullable'],
], [
'agree_terms' => 'Please agree with the terms and conditions.'
'agree_terms' => 'Please agree with the terms and conditions.',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
@@ -85,14 +83,14 @@ class RegisterController extends Controller
'name' => $data['name'],
'email' => strtolower($data['email']),
'password' => bcrypt($data['password']),
'hear_about_us' => $data['hear_about_us']
'hear_about_us' => $data['hear_about_us'],
]);
// Add relation with user
$user->workspaces()->sync([
$workspace->id => [
'role' => 'admin'
]
'role' => 'admin',
],
], false);
$this->appsumoLicense = AppSumoAuthController::registerWithLicense($user, $data['appsumo_license'] ?? null);

View File

@@ -23,7 +23,6 @@ class ResetPasswordController extends Controller
/**
* Get the response for a successful password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
@@ -35,7 +34,6 @@ class ResetPasswordController extends Controller
/**
* Get the response for a failed password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/

View File

@@ -11,23 +11,24 @@ class UserController extends Controller
{
/**
* Get authenticated user.
*
*/
public function current(Request $request)
{
return new UserResource($request->user());
}
public function deleteAccount() {
public function deleteAccount()
{
$this->middleware('auth');
if (Auth::user()->admin) {
return $this->error([
'message' => 'Cannot delete an admin. Stay with us 🙏'
'message' => 'Cannot delete an admin. Stay with us 🙏',
]);
}
Auth::user()->delete();
return $this->success([
'message' => 'User deleted.'
'message' => 'User deleted.',
]);
}
}

View File

@@ -24,8 +24,7 @@ class VerificationController extends Controller
/**
* Mark the user's email address as verified.
*
* @param \Illuminate\Http\Request $request
* @param \App\User $user
* @param \App\User $user
* @return \Illuminate\Http\JsonResponse
*/
public function verify(Request $request, User $user)
@@ -54,7 +53,6 @@ class VerificationController extends Controller
/**
* Resend the email verification notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function resend(Request $request)

View File

@@ -15,29 +15,30 @@ class CaddyController extends Controller
]);
// make sure domain is valid
$domain = $request->input('domain');
if (!preg_match(CustomDomainRequest::CUSTOM_DOMAINS_REGEX, $domain)) {
if (! preg_match(CustomDomainRequest::CUSTOM_DOMAINS_REGEX, $domain)) {
return $this->error([
'success' => false,
'message' => 'Invalid domain',
]);
}
\Log::info('Caddy request received',[
\Log::info('Caddy request received', [
'domain' => $domain,
]);
if ($workspace = Workspace::whereJsonContains('custom_domains',$domain)->first()) {
\Log::info('Caddy request successful',[
if ($workspace = Workspace::whereJsonContains('custom_domains', $domain)->first()) {
\Log::info('Caddy request successful', [
'domain' => $domain,
'workspace' => $workspace->id,
]);
return $this->success([
'success' => true,
'message' => 'OK',
]);
}
\Log::info('Caddy request failed',[
\Log::info('Caddy request failed', [
'domain' => $domain,
'workspace' => $workspace?->id,
]);

View File

@@ -3,19 +3,19 @@
namespace App\Http\Controllers\Content;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ChangelogController extends Controller
{
const CANNY_ENDPOINT = 'https://canny.io/api/v1/';
public const CANNY_ENDPOINT = 'https://canny.io/api/v1/';
public function index()
{
return \Cache::remember('changelog_entries', now()->addHour(), function () {
$response = \Http:: post(self::CANNY_ENDPOINT.'entries/list',[
$response = \Http::post(self::CANNY_ENDPOINT.'entries/list', [
'apiKey' => config('services.canny.api_key'),
'limit' => 3,
]);
return $response->json('entries');
});
}

View File

@@ -12,7 +12,6 @@ class FileUploadController extends Controller
/**
* Upload file to local temp
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function upload(Request $request)
@@ -23,7 +22,7 @@ class FileUploadController extends Controller
return response()->json([
'uuid' => $uuid,
'key' => $path
'key' => $path,
], 201);
}
}

View File

@@ -2,19 +2,15 @@
namespace App\Http\Controllers\Content;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Laravel\Vapor\Http\Controllers\SignedStorageUrlController as Controller;
use Illuminate\Http\Request;
class SignedStorageUrlController extends Controller
{
/**
* Create a new signed URL.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)

View File

@@ -9,19 +9,21 @@ use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
use AuthorizesRequests;
use DispatchesJobs;
use ValidatesRequests;
public function success($data = [])
{
return response()->json(array_merge([
'type' => 'success'
'type' => 'success',
], $data));
}
public function error($data = [], $statusCode = 400)
{
return response()->json(array_merge([
'type' => 'error'
'type' => 'error',
], $data), $statusCode);
}
}

View File

@@ -5,8 +5,6 @@ namespace App\Http\Controllers\Forms;
use App\Http\Controllers\Controller;
use App\Http\Requests\AiGenerateFormRequest;
use App\Models\Forms\AI\AiFormCompletion;
use App\Service\OpenAi\GptCompleter;
use Illuminate\Support\Str;
class AiFormController extends Controller
{
@@ -18,8 +16,8 @@ class AiFormController extends Controller
'message' => 'We\'re working on your form, please wait ~1 min.',
'ai_form_completion_id' => AiFormCompletion::create([
'form_prompt' => $request->input('form_prompt'),
'ip' => $request->ip()
])->id
'ip' => $request->ip(),
])->id,
]);
}
@@ -30,7 +28,7 @@ class AiFormController extends Controller
}
return $this->success([
'ai_form_completion' => $aiFormCompletion
'ai_form_completion' => $aiFormCompletion,
]);
}
}

View File

@@ -17,7 +17,7 @@ use Illuminate\Support\Str;
class FormController extends Controller
{
const ASSETS_UPLOAD_PATH = 'assets/forms';
public const ASSETS_UPLOAD_PATH = 'assets/forms';
private FormCleaner $formCleaner;
@@ -36,26 +36,28 @@ class FormController extends Controller
$workspaceIsPro = $workspace->is_pro;
$forms = $workspace->forms()
->orderByDesc('updated_at')
->paginate(10)->through(function (Form $form) use ($workspace, $workspaceIsPro){
->paginate(10)->through(function (Form $form) use ($workspace, $workspaceIsPro) {
// Add attributes for faster loading
$form->extra = (object) [
'loadedWorkspace' => $workspace,
'workspaceIsPro' => $workspaceIsPro,
'userIsOwner' => true,
'cleanings' => $this->formCleaner
->processForm(request(), $form)
->simulateCleaning($workspace)
->getPerformedCleanings()
];
// Add attributes for faster loading
$form->extra = (object) [
'loadedWorkspace' => $workspace,
'workspaceIsPro' => $workspaceIsPro,
'userIsOwner' => true,
'cleanings' => $this->formCleaner
->processForm(request(), $form)
->simulateCleaning($workspace)
->getPerformedCleanings(),
];
return $form;
});
return $form;
});
return FormResource::collection($forms);
}
/**
* Return all user forms, used for zapier
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function indexAll()
@@ -66,18 +68,20 @@ class FormController extends Controller
$this->authorize('viewAny', Form::class);
$workspaceIsPro = $workspace->is_pro;
$newForms = $workspace->forms()->get()->map(function (Form $form) use ($workspace, $workspaceIsPro){
$newForms = $workspace->forms()->get()->map(function (Form $form) use ($workspace, $workspaceIsPro) {
// Add attributes for faster loading
$form->extra = (object) [
'loadedWorkspace' => $workspace,
'workspaceIsPro' => $workspaceIsPro,
'userIsOwner' => true,
];
return $form;
});
$forms = $forms->merge($newForms);
}
return FormResource::collection($forms);
}
@@ -94,13 +98,13 @@ class FormController extends Controller
->getData();
$form = Form::create(array_merge($formData, [
'creator_id' => $request->user()->id
'creator_id' => $request->user()->id,
]));
return $this->success([
'message' => $this->formCleaner->hasCleaned() ? 'Form successfully created, but the Pro features you used will be disabled when sharing your form:' : 'Form created.' . ($form->visibility == 'draft' ? ' But other people won\'t be able to see the form since it\'s currently in draft mode' : ''),
'message' => $this->formCleaner->hasCleaned() ? 'Form successfully created, but the Pro features you used will be disabled when sharing your form:' : 'Form created.'.($form->visibility == 'draft' ? ' But other people won\'t be able to see the form since it\'s currently in draft mode' : ''),
'form' => (new FormResource($form))->setCleanings($this->formCleaner->getPerformedCleanings()),
'users_first_form' => $request->user()->forms()->count() == 1
'users_first_form' => $request->user()->forms()->count() == 1,
]);
}
@@ -116,13 +120,13 @@ class FormController extends Controller
// Set Removed Properties
$formData['removed_properties'] = array_merge($form->removed_properties, collect($form->properties)->filter(function ($field) use ($formData) {
return (!Str::of($field['type'])->startsWith('nf-') && !in_array($field['id'], collect($formData['properties'])->pluck("id")->toArray()));
return ! Str::of($field['type'])->startsWith('nf-') && ! in_array($field['id'], collect($formData['properties'])->pluck('id')->toArray());
})->toArray());
$form->update($formData);
return $this->success([
'message' => $this->formCleaner->hasCleaned() ? 'Form successfully updated, but the Pro features you used will be disabled when sharing your form:' : 'Form updated.' . ($form->visibility == 'draft' ? ' But other people won\'t be able to see the form since it\'s currently in draft mode' : ''),
'message' => $this->formCleaner->hasCleaned() ? 'Form successfully updated, but the Pro features you used will be disabled when sharing your form:' : 'Form updated.'.($form->visibility == 'draft' ? ' But other people won\'t be able to see the form since it\'s currently in draft mode' : ''),
'form' => (new FormResource($form))->setCleanings($this->formCleaner->getPerformedCleanings()),
]);
}
@@ -133,8 +137,9 @@ class FormController extends Controller
$this->authorize('delete', $form);
$form->delete();
return $this->success([
'message' => 'Form was deleted.'
'message' => 'Form was deleted.',
]);
}
@@ -150,7 +155,7 @@ class FormController extends Controller
return $this->success([
'message' => 'Form successfully duplicated.',
'new_form' => new FormResource($formCopy)
'new_form' => new FormResource($formCopy),
]);
}
@@ -159,7 +164,7 @@ class FormController extends Controller
$form = Form::findOrFail($id);
$this->authorize('update', $form);
if ( $option == 'slug') {
if ($option == 'slug') {
$form->generateSlug();
} elseif ($option == 'uuid') {
$form->slug = Str::uuid();
@@ -168,7 +173,7 @@ class FormController extends Controller
return $this->success([
'message' => 'Form url successfully updated. Your new form url now is: '.$form->share_url.'.',
'form' => new FormResource($form)
'form' => new FormResource($form),
]);
}
@@ -182,8 +187,8 @@ class FormController extends Controller
$fileNameParser = StorageFileNameParser::parse($request->url);
// Make sure we retrieve the file in tmp storage, move it to persistent
$fileName = PublicFormController::TMP_FILE_UPLOAD_PATH.'/'.$fileNameParser->uuid;;
if (!Storage::exists($fileName)) {
$fileName = PublicFormController::TMP_FILE_UPLOAD_PATH.'/'.$fileNameParser->uuid;
if (! Storage::exists($fileName)) {
// File not found, we skip
return null;
}
@@ -192,7 +197,7 @@ class FormController extends Controller
return $this->success([
'message' => 'File uploaded.',
'url' => route("forms.assets.show", [$fileNameParser->getMovedFileName()])
'url' => route('forms.assets.show', [$fileNameParser->getMovedFileName()]),
]);
}
@@ -205,9 +210,9 @@ class FormController extends Controller
$this->authorize('view', $form);
$path = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $form->id).'/'.$fileName;
if (!Storage::exists($path)) {
if (! Storage::exists($path)) {
return $this->error([
'message' => 'File not found.'
'message' => 'File not found.',
]);
}

View File

@@ -19,20 +19,21 @@ class FormStatsController extends Controller
$this->authorize('view', $form);
$formStats = $form->statistics()->where('date','>',now()->subDays(29)->startOfDay())->get();
$periodStats = ["views" => [], "submissions" => []];
$formStats = $form->statistics()->where('date', '>', now()->subDays(29)->startOfDay())->get();
$periodStats = ['views' => [], 'submissions' => []];
foreach (CarbonPeriod::create(now()->subDays(29), now()) as $dateObj) {
$date = $dateObj->format('d-m-Y');
$statisticData = $formStats->where('date', $dateObj->format('Y-m-d'))->first();
$periodStats["views"][$date] = $statisticData->data["views"] ?? 0;
$periodStats["submissions"][$date] = $statisticData->data["submissions"] ?? 0;
$periodStats['views'][$date] = $statisticData->data['views'] ?? 0;
$periodStats['submissions'][$date] = $statisticData->data['submissions'] ?? 0;
if($dateObj->toDateString() === now()->toDateString()){
$periodStats["views"][$date] += $form->views()->count();
$periodStats["submissions"][$date] += $form->submissions()->whereDate('created_at', '>=', now()->startOfDay())->count();
if ($dateObj->toDateString() === now()->toDateString()) {
$periodStats['views'][$date] += $form->views()->count();
$periodStats['submissions'][$date] += $form->submissions()->whereDate('created_at', '>=', now()->startOfDay())->count();
}
}
return $periodStats;
}
}

View File

@@ -2,15 +2,14 @@
namespace App\Http\Controllers\Forms;
use App\Http\Controllers\Controller;
use App\Http\Resources\FormSubmissionResource;
use App\Models\Forms\Form;
use App\Exports\FormSubmissionExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\AnswerFormRequest;
use App\Http\Resources\FormSubmissionResource;
use App\Jobs\Form\StoreFormSubmissionJob;
use App\Models\Forms\Form;
use App\Models\Forms\FormSubmission;
use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Facades\Excel;
@@ -26,7 +25,7 @@ class FormSubmissionController extends Controller
public function submissions(string $id)
{
$form = Form::findOrFail((int)$id);
$form = Form::findOrFail((int) $id);
$this->authorize('view', $form);
return FormSubmissionResource::collection($form->submissions()->paginate(100));
@@ -40,15 +39,16 @@ class FormSubmissionController extends Controller
$job->setSubmissionId($submissionId)->handle();
$data = new FormSubmissionResource(FormSubmission::findOrFail($submissionId));
return $this->success([
'message' => 'Record successfully updated.',
'data' => $data
'data' => $data,
]);
}
public function export(string $id)
{
$form = Form::findOrFail((int)$id);
$form = Form::findOrFail((int) $id);
$this->authorize('view', $form);
$allRows = [];
@@ -61,24 +61,25 @@ class FormSubmissionController extends Controller
->useSignedUrlForFiles();
$allRows[] = [
'id' => Hashids::encode($row['id']),
'created_at' => date("Y-m-d H:i", strtotime($row['created_at'])),
...$formatter->getCleanKeyValue()
'created_at' => date('Y-m-d H:i', strtotime($row['created_at'])),
...$formatter->getCleanKeyValue(),
];
}
$csvExport = (new FormSubmissionExport($allRows));
return Excel::download(
$csvExport,
$form->slug . '-submission-data.csv',
$form->slug.'-submission-data.csv',
\Maatwebsite\Excel\Excel::CSV
);
}
public function submissionFile($id, $fileName)
{
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id) . '/'
. urldecode($fileName);
$fileName = Str::of(PublicFormController::FILE_UPLOAD_PATH)->replace('?', $id).'/'
.urldecode($fileName);
if (!Storage::exists($fileName)) {
if (! Storage::exists($fileName)) {
return $this->error([
'message' => 'File not found.',
], 404);

View File

@@ -5,35 +5,38 @@ namespace App\Http\Controllers\Forms\Integration;
use App\Http\Controllers\Controller;
use App\Http\Requests\Integration\StoreFormZapierWebhookRequest;
use App\Models\Integration\FormZapierWebhook;
use Illuminate\Http\Request;
use Spatie\WebhookServer\WebhookCall;
class FormZapierWebhookController extends Controller
{
/**
* Controller for Zappier webhook subscriptions.
*/
public function __construct() {
// $this->middleware('subscribed');
public function __construct()
{
// $this->middleware('subscribed');
$this->middleware('auth');
}
public function store(StoreFormZapierWebhookRequest $request) {
public function store(StoreFormZapierWebhookRequest $request)
{
$hook = $request->instanciateHook();
$this->authorize('store', $hook);
$hook->save();
return $this->success([
'message' => 'Webhook created.',
'hook' => $hook
'hook' => $hook,
]);
}
public function delete($id) {
public function delete($id)
{
$hook = FormZapierWebhook::findOrFail($id);
$this->authorize('store', $hook);
$hook->delete();
return $this->success([
'message' => 'Webhook deleted.',
]);

View File

@@ -11,15 +11,15 @@ use App\Models\Forms\FormSubmission;
use App\Service\Forms\FormCleaner;
use App\Service\WorkspaceHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Vinkla\Hashids\Facades\Hashids;
class PublicFormController extends Controller
{
public const FILE_UPLOAD_PATH = 'forms/?/submissions';
const FILE_UPLOAD_PATH = 'forms/?/submissions';
const TMP_FILE_UPLOAD_PATH = 'tmp/';
public const TMP_FILE_UPLOAD_PATH = 'tmp/';
public function show(Request $request, string $slug)
{
@@ -27,21 +27,22 @@ class PublicFormController extends Controller
if ($form->workspace == null) {
// Workspace deleted
return $this->error([
'message' => 'Form not found.'
'message' => 'Form not found.',
], 404);
}
$formCleaner = new FormCleaner();
// Disable pro features if needed
$form->fill($formCleaner
$form->fill(
$formCleaner
->processForm($request, $form)
->performCleaning($form->workspace)
->getData()
);
// Increase form view counter if not login
if(!Auth::check()){
if (! Auth::check()) {
$form->views()->create();
}
@@ -53,25 +54,26 @@ class PublicFormController extends Controller
{
// Check that form has user field
$form = $request->form;
if (!$form->has_user_field) {
if (! $form->has_user_field) {
return [];
}
// Use serializer
$workspace = $form->workspace;
return (new WorkspaceHelper($workspace))->getAllUsers();
}
public function showAsset($assetFileName)
{
$path = FormController::ASSETS_UPLOAD_PATH.'/'.$assetFileName;
if (!Storage::exists($path)) {
if (! Storage::exists($path)) {
return $this->error([
'message' => 'File not found.',
'file_name' => $assetFileName
'file_name' => $assetFileName,
]);
}
return redirect()->to(Storage::temporaryUrl($path, now()->addMinutes(5)));
}
@@ -84,18 +86,18 @@ class PublicFormController extends Controller
$job = new StoreFormSubmissionJob($form, $request->validated());
$job->handle();
$submissionId = Hashids::encode($job->getSubmissionId());
}else{
} else {
StoreFormSubmissionJob::dispatch($form, $request->validated());
}
return $this->success(array_merge([
'message' => 'Form submission saved.',
'submission_id' => $submissionId
'submission_id' => $submissionId,
], $request->form->is_pro && $request->form->redirect_url ? [
'redirect' => true,
'redirect_url' => $request->form->redirect_url
'redirect_url' => $request->form->redirect_url,
] : [
'redirect' => false
'redirect' => false,
]));
}
@@ -104,7 +106,7 @@ class PublicFormController extends Controller
$submissionId = ($submissionId) ? Hashids::decode($submissionId) : false;
$submissionId = isset($submissionId[0]) ? $submissionId[0] : false;
$form = Form::whereSlug($slug)->whereVisibility('public')->firstOrFail();
if ($form->workspace == null || !$form->editable_submissions || !$submissionId) {
if ($form->workspace == null || ! $form->editable_submissions || ! $submissionId) {
return $this->error([
'message' => 'Not allowed.',
]);
@@ -120,5 +122,4 @@ class PublicFormController extends Controller
return $this->success(['data' => ($submission) ? $submission->data : []]);
}
}

View File

@@ -17,8 +17,7 @@ class RecordController extends Controller
$record->delete();
return $this->success([
'message' => 'Record successfully removed.'
'message' => 'Record successfully removed.',
]);
}
}

View File

@@ -10,7 +10,6 @@ class PasswordController extends Controller
/**
* Update the user's password.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)

View File

@@ -10,7 +10,6 @@ class ProfileController extends Controller
/**
* Update the user's profile information.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)

View File

@@ -2,18 +2,15 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Spatie\Sitemap\Sitemap;
use Spatie\Sitemap\Tags\Url;
use App\Models\Template;
use Illuminate\Http\Request;
class SitemapController extends Controller
{
public function index(Request $request)
{
return [
...$this->getTemplatesUrls()
...$this->getTemplatesUrls(),
];
}
@@ -23,10 +20,11 @@ class SitemapController extends Controller
Template::where('publicly_listed', true)->chunk(100, function ($templates) use (&$urls) {
foreach ($templates as $template) {
$urls[] = [
'loc' => '/templates/' . $template->slug
'loc' => '/templates/'.$template->slug,
];
}
});
return $urls;
}
}

View File

@@ -9,10 +9,11 @@ use Laravel\Cashier\Subscription;
class SubscriptionController extends Controller
{
const SUBSCRIPTION_PLANS = ['monthly', 'yearly'];
public const SUBSCRIPTION_PLANS = ['monthly', 'yearly'];
const PRO_SUBSCRIPTION_NAME = 'default';
const SUBSCRIPTION_NAMES = [
public const PRO_SUBSCRIPTION_NAME = 'default';
public const SUBSCRIPTION_NAMES = [
self::PRO_SUBSCRIPTION_NAME,
];
@@ -30,7 +31,7 @@ class SubscriptionController extends Controller
if ($user->subscriptions()->where('stripe_status', 'past_due')->first()) {
return $this->error([
'message' => 'You already have a past due subscription. Please verify your details in the billing page,
and contact us if the issue persists.'
and contact us if the issue persists.',
]);
}
@@ -51,18 +52,18 @@ class SubscriptionController extends Controller
'customer_update' => [
'address' => 'auto',
'name' => 'never',
]
],
]);
return $this->success([
'checkout_url' => $checkout->url
'checkout_url' => $checkout->url,
]);
}
public function updateStripeDetails(UpdateStripeDetailsRequest $request)
{
$user = Auth::user();
if (!$user->hasStripeId()) {
if (! $user->hasStripeId()) {
$user->createAsStripeCustomer();
}
$user->updateStripeCustomer([
@@ -78,13 +79,14 @@ class SubscriptionController extends Controller
public function billingPortal()
{
$this->middleware('auth');
if (!Auth::user()->has_customer_id) {
if (! Auth::user()->has_customer_id) {
return $this->error([
"message" => "Please subscribe before accessing your billing portal."
'message' => 'Please subscribe before accessing your billing portal.',
]);
}
return $this->success([
'portal_url' => Auth::user()->billingPortalUrl(front_url('/home'))
'portal_url' => Auth::user()->billingPortalUrl(front_url('/home')),
]);
}

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests\Templates\FormTemplateRequest;
use App\Http\Resources\FormTemplateResource;
use App\Models\Template;
@@ -13,20 +12,20 @@ class TemplateController extends Controller
{
public function index(Request $request)
{
$limit = (int)$request->get('limit', 0);
$onlyMy = (bool)$request->get('onlymy', false);
$limit = (int) $request->get('limit', 0);
$onlyMy = (bool) $request->get('onlymy', false);
$templates = Template::when(Auth::check(), function ($query) use ($onlyMy) {
if ($onlyMy) {
$query->where('creator_id', Auth::id());
} else {
$query->where(function ($query) {
$query->where('publicly_listed', true)
->orWhere('creator_id', Auth::id());
});
}
})
->when(!Auth::check(), function ($query) {
if ($onlyMy) {
$query->where('creator_id', Auth::id());
} else {
$query->where(function ($query) {
$query->where('publicly_listed', true)
->orWhere('creator_id', Auth::id());
});
}
})
->when(! Auth::check(), function ($query) {
$query->where('publicly_listed', true);
})
->when($limit > 0, function ($query) use ($limit) {
@@ -49,7 +48,7 @@ class TemplateController extends Controller
return $this->success([
'message' => 'Template was created.',
'template_id' => $template->id,
'data' => new FormTemplateResource($template)
'data' => new FormTemplateResource($template),
]);
}
@@ -63,7 +62,7 @@ class TemplateController extends Controller
return $this->success([
'message' => 'Template was updated.',
'template_id' => $template->id,
'data' => new FormTemplateResource($template)
'data' => new FormTemplateResource($template),
]);
}

View File

@@ -4,8 +4,8 @@ namespace App\Http\Controllers\Webhook;
use App\Http\Controllers\Controller;
use App\Models\License;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\UnauthorizedException;
class AppSumoController extends Controller
@@ -16,6 +16,7 @@ class AppSumoController extends Controller
if ($request->test) {
Log::info('[APPSUMO] test request received', $request->toArray());
return $this->success([
'message' => 'Webhook received.',
'event' => $request->event,
@@ -69,11 +70,13 @@ class AppSumoController extends Controller
$license->user_id = $licenseData['user_id'] ?? null;
$license->save();
Log::info('[APPSUMO] creating new license',
Log::info(
'[APPSUMO] creating new license',
[
'license_key' => $license->license_key,
'license_id' => $license->id,
]);
]
);
return $license;
}

View File

@@ -5,13 +5,11 @@ namespace App\Http\Controllers\Webhook;
use App\Notifications\Subscription\FailedPaymentNotification;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Log;
use Laravel\Cashier\Http\Controllers\WebhookController;
use Stripe\Subscription as StripeSubscription;
class StripeController extends WebhookController
{
public function handleCustomerSubscriptionCreated(array $payload)
{
return parent::handleCustomerSubscriptionCreated($payload);
@@ -19,7 +17,7 @@ class StripeController extends WebhookController
/**
* Override to add a sleep, and to detect plan upgrades
* @param array $payload
*
* @return \Symfony\Component\HttpFoundation\Response|void
*/
protected function handleCustomerSubscriptionUpdated(array $payload)
@@ -59,7 +57,7 @@ class StripeController extends WebhookController
if (isset($data['trial_end'])) {
$trialEnd = Carbon::createFromTimestamp($data['trial_end']);
if (!$subscription->trial_ends_at || $subscription->trial_ends_at->ne($trialEnd)) {
if (! $subscription->trial_ends_at || $subscription->trial_ends_at->ne($trialEnd)) {
$subscription->trial_ends_at = $trialEnd;
}
}
@@ -125,7 +123,7 @@ class StripeController extends WebhookController
return $plan;
}
}
return 'default';
}
}

View File

@@ -5,8 +5,8 @@ namespace App\Http\Controllers;
use App\Http\Requests\Workspace\CustomDomainRequest;
use App\Http\Resources\WorkspaceResource;
use App\Models\Workspace;
use Illuminate\Http\Request;
use App\Service\WorkspaceHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class WorkspaceController extends Controller
@@ -19,6 +19,7 @@ class WorkspaceController extends Controller
public function index()
{
$this->authorize('viewAny', Workspace::class);
return WorkspaceResource::collection(Auth::user()->workspaces);
}
@@ -34,6 +35,7 @@ class WorkspaceController extends Controller
{
$request->workspace->custom_domains = $request->customDomains;
$request->workspace->save();
return new WorkspaceResource($request->workspace);
}
@@ -44,9 +46,10 @@ class WorkspaceController extends Controller
$id = $workspace->id;
$workspace->delete();
return $this->success([
'message' => 'Workspace deleted.',
'workspace_id' => $id
'workspace_id' => $id,
]);
}
@@ -55,7 +58,7 @@ class WorkspaceController extends Controller
$user = $request->user();
$this->validate($request, [
'name' => 'required'
'name' => 'required',
]);
// Create workspace
@@ -67,14 +70,14 @@ class WorkspaceController extends Controller
// Add relation with user
$user->workspaces()->sync([
$workspace->id => [
'role' => 'admin'
]
'role' => 'admin',
],
], false);
return $this->success([
'message' => 'Workspace created.',
'workspace_id' => $workspace->id,
'workspace' => new WorkspaceResource($workspace)
'workspace' => new WorkspaceResource($workspace),
]);
}
}