Compare commits
5 Commits
d6cb058830
...
156d8a9f68
Author | SHA1 | Date | |
---|---|---|---|
156d8a9f68 | |||
478cbe4762 | |||
35c2368ae2 | |||
303af6f203 | |||
1485180e20 |
@ -1,5 +1,6 @@
|
||||
DOCKER_APP_PORT=8080
|
||||
DOCKER_CAPTCHA_PORT=8081
|
||||
DOCKER_CAPTCHA_WEBSOCKET_PORT=8082
|
||||
DOCKER_DB_PORT=3306
|
||||
MYSQL_ROOT_PASSWORD=root_pass
|
||||
DB_DATABASE=my-projetcs
|
||||
|
@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers\Site;
|
||||
|
||||
use App\Http\Requests\Site\Feedback\SendRequest;
|
||||
use App\Models\ProjectFeedback;
|
||||
use App\Services\Site\FeedbackService;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
@ -16,7 +16,6 @@ public function index(Request $request): View
|
||||
{
|
||||
$user = $request->user();
|
||||
$project = $request->get('project');
|
||||
$websiteTranslations = $request->get('websiteTranslations');
|
||||
|
||||
if (\is_null($project)) {
|
||||
$with = ['storage'];
|
||||
@ -28,7 +27,8 @@ public function index(Request $request): View
|
||||
return \view('site.projects.index', $result->getData());
|
||||
}
|
||||
|
||||
$result = $this->projectService->getAboutByProject($project, $websiteTranslations, $request->user());
|
||||
$websiteTranslations = $request->get('websiteTranslations');
|
||||
$result = $this->projectService->getAboutByProject($project, $websiteTranslations, $user);
|
||||
if ($result->isError()) {
|
||||
$this->errors($result);
|
||||
}
|
||||
|
25
app/application/app/Http/Middleware/IsProject.php
Normal file
25
app/application/app/Http/Middleware/IsProject.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Models\Project;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
final class IsProject
|
||||
{
|
||||
public function handle(Request $request, \Closure $next): Response
|
||||
{
|
||||
$project = $request->get('project');
|
||||
if (\is_null($project)) {
|
||||
\abort(Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
if ($project instanceof Project === false) {
|
||||
\report("$project must be an instance of Project");
|
||||
\abort(Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Services\WebsiteTranslations;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
final class IsWebsiteTranslations
|
||||
{
|
||||
public function handle(Request $request, \Closure $next): Response
|
||||
{
|
||||
$websiteTranslations = $request->get('websiteTranslations');
|
||||
if (\is_null($websiteTranslations)) {
|
||||
\abort(Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
if ($websiteTranslations instanceof WebsiteTranslations === false) {
|
||||
\report("$websiteTranslations must be an instance of WebsiteTranslations");
|
||||
\abort(Response::HTTP_NOT_FOUND);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Closure;
|
||||
|
||||
class ProjectAndLanguage extends ProjectLanguage
|
||||
final class ProjectAndLanguage extends ProjectLanguage
|
||||
{
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
|
@ -242,6 +242,9 @@ body.mobile-menu-open {
|
||||
#mobile-menu {
|
||||
display: none;
|
||||
}
|
||||
.wrapper .section-container {
|
||||
flex: auto;
|
||||
}
|
||||
.main-container {
|
||||
flex-direction: row;
|
||||
}
|
||||
@ -255,6 +258,7 @@ body.mobile-menu-open {
|
||||
padding: 7px 10px 7px 0;
|
||||
}
|
||||
#menu {
|
||||
flex: none;
|
||||
background: #eee;
|
||||
display: block;
|
||||
width: 175px;
|
||||
|
@ -8,6 +8,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th class="border-0">{{ __('admin-sections.Project') }}</th>
|
||||
<th class="border-0">{{ __('validation.attributes.date') }}</th>
|
||||
<th class="border-0" style="width: 100%;">{{ __('site.attributes.message') }}</th>
|
||||
<th class="border-0">{{ __('site.attributes.name') }}</th>
|
||||
<th class="border-0">{{ __('site.attributes.email') }}</th>
|
||||
@ -17,6 +18,9 @@
|
||||
@foreach($feedbacks as $feedback)
|
||||
<tr>
|
||||
<td>{{ $feedback->project->name }}</td>
|
||||
<td data-bs-toggle="tooltip" data-bs-placement="top" title="{{ $feedback->created_at->timezone(\App\Helpers\Helpers::getUserTimeZone())->isoFormat('LLL') }}">
|
||||
{{ $feedback->created_at->diffForHumans() }}
|
||||
</td>
|
||||
<td>{!! $feedback->message !!}</td>
|
||||
<td>
|
||||
<p>{{ $feedback->name }}</p>
|
||||
|
@ -8,6 +8,7 @@
|
||||
<table class="table table-centered table-nowrap mb-0 rounded">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th class="border-0">{{ __('validation.attributes.date') }}</th>
|
||||
<th class="border-0" style="width: 100%;">{{ __('site.attributes.message') }}</th>
|
||||
<th class="border-0">{{ __('site.attributes.name') }}</th>
|
||||
<th class="border-0">{{ __('site.attributes.email') }}</th>
|
||||
@ -16,6 +17,9 @@
|
||||
<tbody>
|
||||
@foreach($feedbacks as $feedback)
|
||||
<tr>
|
||||
<td data-bs-toggle="tooltip" data-bs-placement="top" title="{{ $feedback->created_at->timezone(\App\Helpers\Helpers::getUserTimeZone())->isoFormat('LLL') }}">
|
||||
{{ $feedback->created_at->diffForHumans() }}
|
||||
</td>
|
||||
<td>{!! $feedback->message !!}</td>
|
||||
<td>
|
||||
<p>{{ $feedback->name }}</p>
|
||||
|
@ -3,11 +3,13 @@
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('/', [\App\Http\Controllers\Site\ProjectsController::class, 'index'])->name('home');
|
||||
Route::middleware([\App\Http\Middleware\IsProject::class, \App\Http\Middleware\IsWebsiteTranslations::class])->group(function () {
|
||||
Route::get('/language/{language}', [\App\Http\Controllers\Site\ProjectsController::class, 'index'])->name('home-language');
|
||||
|
||||
Route::get('feedback', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback');
|
||||
Route::get('feedback/language/{language}', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback-language');
|
||||
Route::get('feedback/success', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback.success');
|
||||
Route::get('feedback/success/language/{language}', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback.success-language');
|
||||
Route::post('feedback', [\App\Http\Controllers\Site\FeedbackController::class, 'send'])->name('feedback.send');
|
||||
Route::post('feedback/language/{language}', [\App\Http\Controllers\Site\FeedbackController::class, 'send'])->name('feedback.send-language');
|
||||
Route::prefix('feedback')->group(function () {
|
||||
Route::get('/', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback');
|
||||
Route::get('language/{language}', [\App\Http\Controllers\Site\FeedbackController::class, 'index'])->name('feedback-language');
|
||||
Route::post('/', [\App\Http\Controllers\Site\FeedbackController::class, 'send'])->name('feedback.send');
|
||||
Route::post('language/{language}', [\App\Http\Controllers\Site\FeedbackController::class, 'send'])->name('feedback.send-language');
|
||||
});
|
||||
});
|
||||
|
@ -7,6 +7,12 @@ APP_FORCE_HTTPS=false
|
||||
|
||||
CAPTCHA_VERIFICATION_DATA_VIEW_LIMIT_IN_MINUTES=1
|
||||
|
||||
APP_CAPTCHA=false
|
||||
CAPTCHA_API_DOMAIN=http://your-domain-captcha-or-IP:8081
|
||||
CAPTCHA_PRIVATE_TOKEN=
|
||||
CAPTCHA_STATIC_PATH=http://your-domain-captcha-or-IP:8081/captcha
|
||||
CAPTCHA_PUBLIC_TOKEN=
|
||||
|
||||
LOGIN_MAX_REQUEST=20
|
||||
LOGIN_MAX_EMAIL_REQUEST=10
|
||||
|
||||
@ -70,3 +76,21 @@ VITE_PUSHER_HOST="${PUSHER_HOST}"
|
||||
VITE_PUSHER_PORT="${PUSHER_PORT}"
|
||||
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
|
||||
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
REVERB_APP_ID=
|
||||
REVERB_APP_KEY=
|
||||
REVERB_APP_SECRET=
|
||||
REVERB_HOST="captcha-reverb"
|
||||
REVERB_PORT=9000
|
||||
REVERB_SCHEME=http
|
||||
# * or localhost.com or localhost.com, localhost.net
|
||||
REVERB_ALLOWED_ORIGINS="*"
|
||||
|
||||
REVERB_HOST_CLIENT="localhost"
|
||||
REVERB_PORT_CLIENT=8081
|
||||
REVERB_SCHEME_CLIENT=http
|
||||
|
||||
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
|
||||
VITE_REVERB_HOST="${REVERB_HOST}"
|
||||
VITE_REVERB_PORT="${REVERB_PORT}"
|
||||
VITE_REVERB_SCHEME="${REVERB_SCHEME}"
|
||||
|
@ -19,7 +19,7 @@ services:
|
||||
# restart: always
|
||||
|
||||
captcha-app:
|
||||
image: korelf/service-captcha:0.7.1
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
cap_drop:
|
||||
- ALL
|
||||
@ -34,6 +34,35 @@ services:
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_PORT}:9000
|
||||
captcha-queue:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: queue
|
||||
env_file: captcha-app/.env
|
||||
captcha-reverb:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: websockets
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_WEBSOCKET_PORT}:9000
|
||||
captcha-scheduler:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: scheduler
|
||||
env_file: captcha-app/.env
|
||||
captcha-redis:
|
||||
image: redis:3.0-alpine
|
||||
# restart: always
|
||||
|
@ -18,7 +18,7 @@ services:
|
||||
# restart: always
|
||||
|
||||
captcha-app:
|
||||
image: korelf/service-captcha:0.7.1
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
cap_drop:
|
||||
- ALL
|
||||
@ -33,6 +33,35 @@ services:
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_PORT}:9000
|
||||
captcha-queue:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: queue
|
||||
env_file: captcha-app/.env
|
||||
captcha-reverb:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: websockets
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_WEBSOCKET_PORT}:9000
|
||||
captcha-scheduler:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: scheduler
|
||||
env_file: captcha-app/.env
|
||||
captcha-redis:
|
||||
image: redis:3.0-alpine
|
||||
# restart: always
|
||||
|
@ -17,7 +17,7 @@ services:
|
||||
image: redis:3.0-alpine
|
||||
|
||||
captcha-app:
|
||||
image: korelf/service-captcha:0.7.0
|
||||
image: korelf/service-captcha:0.8.1
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
@ -31,6 +31,35 @@ services:
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_PORT}:9000
|
||||
captcha-queue:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: queue
|
||||
env_file: captcha-app/.env
|
||||
captcha-reverb:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: websockets
|
||||
env_file: captcha-app/.env
|
||||
ports:
|
||||
- ${DOCKER_CAPTCHA_WEBSOCKET_PORT}:9000
|
||||
captcha-scheduler:
|
||||
image: korelf/service-captcha:0.8.1
|
||||
# restart: always
|
||||
depends_on:
|
||||
- db
|
||||
- captcha-redis
|
||||
environment:
|
||||
CONTAINER_ROLE: scheduler
|
||||
env_file: captcha-app/.env
|
||||
captcha-redis:
|
||||
image: redis:3.0-alpine
|
||||
db:
|
||||
|
Loading…
Reference in New Issue
Block a user