refactor: replace custom CRM with Monica fork
Some checks failed
Build & Push Monica Image to Gitea Registry / build-and-push (push) Failing after 9s

This commit is contained in:
Kroonk
2026-05-22 16:19:55 +02:00
parent 38cc4c09ca
commit a213a1dba0
2215 changed files with 242567 additions and 6015 deletions

View File

@@ -0,0 +1,135 @@
<?php
namespace App\Http\Controllers\Api\Account\Activity;
use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Models\Account\ActivityTypeCategory;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Account\Activity\ActivityTypeCategory\CreateActivityTypeCategory;
use App\Services\Account\Activity\ActivityTypeCategory\UpdateActivityTypeCategory;
use App\Services\Account\Activity\ActivityTypeCategory\DestroyActivityTypeCategory;
use App\Http\Resources\Activity\ActivityTypeCategory as ActivityTypeCategoryResource;
class ApiActivityTypeCategoryController extends ApiController
{
/**
* Get the list of activity type categories.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$activityTypeCategories = auth()->user()->account->activityTypeCategories()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ActivityTypeCategoryResource::collection($activityTypeCategories);
}
/**
* Get the detail of a given activity type category.
*
* @param Request $request
* @param int $activityTypeCategoryId
* @return ActivityTypeCategoryResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $activityTypeCategoryId)
{
try {
$activityTypeCategory = ActivityTypeCategory::where('account_id', auth()->user()->account_id)
->where('id', $activityTypeCategoryId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ActivityTypeCategoryResource($activityTypeCategory);
}
/**
* Store the activity type category.
*
* @param Request $request
* @return ActivityTypeCategoryResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$activityTypeCategory = app(CreateActivityTypeCategory::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityTypeCategoryResource($activityTypeCategory);
}
/**
* Update the activity type category.
*
* @param Request $request
* @param int $activityTypeCategoryId
* @return ActivityTypeCategoryResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $activityTypeCategoryId)
{
try {
$activityTypeCategory = app(UpdateActivityTypeCategory::class)->execute(
$request->except(['account_id', 'activity_type_category_id'])
+
[
'account_id' => auth()->user()->account_id,
'activity_type_category_id' => $activityTypeCategoryId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityTypeCategoryResource($activityTypeCategory);
}
/**
* Delete an activity type category.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $activityTypeCategoryId)
{
try {
app(DestroyActivityTypeCategory::class)->execute([
'account_id' => auth()->user()->account_id,
'activity_type_category_id' => $activityTypeCategoryId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($activityTypeCategoryId);
}
}

View File

@@ -0,0 +1,135 @@
<?php
namespace App\Http\Controllers\Api\Account\Activity;
use Illuminate\Http\Request;
use App\Models\Account\ActivityType;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Account\Activity\ActivityType\CreateActivityType;
use App\Services\Account\Activity\ActivityType\UpdateActivityType;
use App\Services\Account\Activity\ActivityType\DestroyActivityType;
use App\Http\Resources\Activity\ActivityType as ActivityTypeResource;
class ApiActivityTypeController extends ApiController
{
/**
* Get the list of activity types.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$activityTypes = auth()->user()->account->activityTypes()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ActivityTypeResource::collection($activityTypes);
}
/**
* Get the detail of a given activity type.
*
* @param Request $request
* @return ActivityTypeResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $activityTypeId)
{
try {
$activityType = ActivityType::where('account_id', auth()->user()->account_id)
->where('id', $activityTypeId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ActivityTypeResource($activityType);
}
/**
* Store the activity type.
*
* @param Request $request
* @return ActivityTypeResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$activityType = app(CreateActivityType::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityTypeResource($activityType);
}
/**
* Update the activity type.
*
* @param Request $request
* @param int $activityTypeId
* @return ActivityTypeResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $activityTypeId)
{
try {
$activityType = app(UpdateActivityType::class)->execute(
$request->except(['account_id', 'activity_type_id'])
+
[
'account_id' => auth()->user()->account_id,
'activity_type_id' => $activityTypeId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityTypeResource($activityType);
}
/**
* Delete an activity type.
*
* @param Request $request
* @param int $activityTypeId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $activityTypeId)
{
try {
app(DestroyActivityType::class)->execute([
'account_id' => auth()->user()->account_id,
'activity_type_id' => $activityTypeId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($activityTypeId);
}
}

View File

@@ -0,0 +1,135 @@
<?php
namespace App\Http\Controllers\Api\Account;
use Illuminate\Http\Request;
use App\Models\Account\Company;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Account\Company\CreateCompany;
use App\Services\Account\Company\UpdateCompany;
use App\Services\Account\Company\DestroyCompany;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Company\Company as CompanyResource;
class ApiCompanyController extends ApiController
{
/**
* Get the list of companies.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$companies = auth()->user()->account->companies()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return CompanyResource::collection($companies);
}
/**
* Get the detail of a given company.
*
* @param Request $request
* @return CompanyResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $companyId)
{
try {
$company = Company::where('account_id', auth()->user()->account_id)
->where('id', $companyId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new CompanyResource($company);
}
/**
* Store the company.
*
* @param Request $request
* @return CompanyResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$company = app(CreateCompany::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
'author_id' => auth()->user()->id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new CompanyResource($company);
}
/**
* Update a company.
*
* @param Request $request
* @param int $companyId
* @return CompanyResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $companyId)
{
try {
$company = app(UpdateCompany::class)->execute(
$request->except(['account_id', 'company_id'])
+
[
'account_id' => auth()->user()->account_id,
'company_id' => $companyId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new CompanyResource($company);
}
/**
* Delete a company.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $companyId)
{
try {
app(DestroyCompany::class)->execute([
'account_id' => auth()->user()->account_id,
'company_id' => $companyId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($companyId);
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Http\Controllers\Api\Account;
use Illuminate\Http\Request;
use App\Models\Contact\Gender;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Services\Account\Gender\CreateGender;
use App\Services\Account\Gender\UpdateGender;
use App\Services\Account\Gender\DestroyGender;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Gender\Gender as GenderResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiGenderController extends ApiController
{
/**
* Get the list of genders.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$genders = auth()->user()->account->genders()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return GenderResource::collection($genders);
}
/**
* Get the detail of a given gender.
*
* @param Request $request
* @return GenderResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $genderId)
{
try {
$gender = Gender::where('account_id', auth()->user()->account_id)
->where('id', $genderId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new GenderResource($gender);
}
/**
* Store the gender.
*
* @param Request $request
* @return GenderResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$gender = app(CreateGender::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new GenderResource($gender);
}
/**
* Update a gender.
*
* @param Request $request
* @param int $genderId
* @return GenderResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $genderId)
{
try {
$gender = app(UpdateGender::class)->execute(
$request->except(['account_id', 'gender_id'])
+
[
'account_id' => auth()->user()->account_id,
'gender_id' => $genderId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new GenderResource($gender);
}
/**
* Delete a gender.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $genderId)
{
try {
app(DestroyGender::class)->execute([
'account_id' => auth()->user()->account_id,
'gender_id' => $genderId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($genderId);
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Http\Controllers\Api\Account;
use Illuminate\Http\Request;
use App\Models\Account\Place;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Services\Account\Place\CreatePlace;
use App\Services\Account\Place\UpdatePlace;
use App\Services\Account\Place\DestroyPlace;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Place\Place as PlaceResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiPlaceController extends ApiController
{
/**
* Get the list of places.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$places = auth()->user()->account->places()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return PlaceResource::collection($places);
}
/**
* Get the detail of a given place.
*
* @param Request $request
* @return PlaceResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $placeId)
{
try {
$place = Place::where('account_id', auth()->user()->account_id)
->where('id', $placeId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new PlaceResource($place);
}
/**
* Store the place.
*
* @param Request $request
* @return PlaceResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$place = app(CreatePlace::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new PlaceResource($place);
}
/**
* Update a place.
*
* @param Request $request
* @param int $placeId
* @return PlaceResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $placeId)
{
try {
$place = app(UpdatePlace::class)->execute(
$request->except(['account_id', 'place_id'])
+
[
'account_id' => auth()->user()->account_id,
'place_id' => $placeId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new PlaceResource($place);
}
/**
* Delete a place.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $placeId)
{
try {
app(DestroyPlace::class)->execute([
'account_id' => auth()->user()->account_id,
'place_id' => $placeId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($placeId);
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace App\Http\Controllers\Api\Account;
use App\Models\User\User;
use App\Helpers\DateHelper;
use Illuminate\Http\Request;
use App\Models\Settings\Term;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use App\Services\User\AcceptPolicy;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Account\User\User as UserResource;
use App\Http\Resources\Settings\Compliance\Compliance as ComplianceResource;
class ApiUserController extends ApiController
{
/**
* Get the detail of the authenticated user.
*
* @param Request $request
* @return UserResource
*/
public function show(Request $request): UserResource
{
return new UserResource(auth()->user());
}
/**
* Get the state of a specific term for the user.
*
* @param Request $request
* @param int $termId
* @return JsonResponse
*/
public function get(Request $request, $termId)
{
try {
$term = Term::findOrFail($termId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$termUser = DB::table('term_user')->where('user_id', auth()->user()->id)
->where('account_id', auth()->user()->account_id)
->where('term_id', $term->id)
->first();
if ($termUser) {
$data = [
'signed' => true,
'signed_date' => DateHelper::getTimestamp($termUser->created_at),
'ip_address' => $termUser->ip_address,
'user' => new UserResource(auth()->user()),
'term' => new ComplianceResource($term),
];
} else {
return $this->respondNotFound();
}
return $this->respond([
'data' => $data,
]);
}
/**
* Get all the policies ever signed by the authenticated user.
*
* @param Request $request
* @return JsonResponse
*/
public function getSignedPolicies(Request $request)
{
$terms = collect();
$termsForUser = DB::table('term_user')
->where('user_id', auth()->user()->id)
->get();
if ($termsForUser->count() == 0) {
return $this->respondNotFound();
}
foreach ($termsForUser as $termUser) {
$term = Term::findOrFail($termUser->term_id);
$terms->push([
'signed' => true,
'signed_date' => DateHelper::getTimestamp($termUser->created_at),
'ip_address' => $termUser->ip_address,
'user' => new UserResource(auth()->user()),
'term' => new ComplianceResource($term),
]);
}
return $this->respond([
'data' => $terms,
]);
}
/**
* Sign the latest policy for the authenticated user.
*
* @param Request $request
* @return JsonResponse
*/
public function set(Request $request)
{
$validator = Validator::make($request->all(), [
'ip_address' => 'required',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
try {
$term = app(AcceptPolicy::class)->execute([
'account_id' => auth()->user()->account_id,
'user_id' => auth()->user()->id,
'ip_address' => $request->input('ip_address'),
]);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
try {
$termUser = DB::table('term_user')->where('user_id', auth()->user()->id)
->where('account_id', auth()->user()->account_id)
->where('term_id', $term->id)
->first();
} catch (ModelNotFoundException $e) {
return $this->respondInvalidQuery();
}
return $this->respond([
'data' => [
'signed' => true,
'signed_date' => DateHelper::getTimestamp($termUser->created_at),
'ip_address' => $termUser->ip_address,
'user' => new UserResource(auth()->user()),
'term' => new ComplianceResource($term),
],
]);
}
}

View File

@@ -0,0 +1,161 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Helpers\AccountHelper;
use App\Models\Contact\Contact;
use App\Models\Account\Activity;
use Illuminate\Database\QueryException;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Account\Activity\Activity\CreateActivity;
use App\Services\Account\Activity\Activity\UpdateActivity;
use App\Services\Account\Activity\Activity\DestroyActivity;
use App\Http\Resources\Activity\Activity as ActivityResource;
class ApiActivitiesController extends ApiController
{
/**
* Get the list of activities.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$activities = auth()->user()->account->activities()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ActivityResource::collection($activities)->additional(['meta' => [
'statistics' => AccountHelper::getYearlyActivitiesStatistics(auth()->user()->account),
]]);
}
/**
* Get the detail of a given activity.
*
* @param Request $request
* @return ActivityResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $activityId)
{
try {
$activity = Activity::where('account_id', auth()->user()->account_id)
->findOrFail($activityId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ActivityResource($activity);
}
/**
* Store the activity.
*
* @param Request $request
* @return ActivityResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$activity = app(CreateActivity::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityResource($activity);
}
/**
* Update the activity.
*
* @param Request $request
* @param int $activityId
* @return ActivityResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $activityId)
{
try {
$activity = app(UpdateActivity::class)->execute(
$request->except(['account_id', 'activity_id'])
+
[
'account_id' => auth()->user()->account_id,
'activity_id' => $activityId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ActivityResource($activity);
}
/**
* Delete an activity.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $activityId)
{
try {
app(DestroyActivity::class)->execute([
'account_id' => auth()->user()->account_id,
'activity_id' => $activityId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return $this->respondObjectDeleted($activityId);
}
/**
* Get the list of activities for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function activities(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->findOrFail($contactId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$activities = $contact->activities()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ActivityResource::collection($activities)->additional(['meta' => [
'statistics' => AccountHelper::getYearlyActivitiesStatistics(auth()->user()->account),
]]);
}
}

View File

@@ -0,0 +1,260 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Helpers\SearchHelper;
use App\Models\Contact\Contact;
use Illuminate\Http\JsonResponse;
use App\Jobs\UpdateLastConsultedDate;
use Illuminate\Database\QueryException;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Contact\CreateContact;
use App\Services\Contact\Contact\UpdateContact;
use App\Services\Contact\Contact\DestroyContact;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Services\Contact\Contact\UpdateWorkInformation;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Contact\Contact as ContactResource;
use App\Services\Contact\Contact\UpdateContactIntroduction;
use App\Services\Contact\Contact\UpdateContactFoodPreferences;
class ApiContactController extends ApiController
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('limitations')->only('setMe');
parent::__construct();
}
/**
* Get the list of the contacts.
* We will only retrieve the contacts that are "real", not the partials
* ones.
*
* @param Request $request
* @return JsonResource|JsonResponse
*/
public function index(Request $request)
{
if ($request->input('query')) {
$needle = rawurldecode($request->input('query'));
try {
$contacts = SearchHelper::searchContacts(
$needle,
$this->sort,
$this->sortDirection
)
->real()
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ContactResource::collection($contacts)->additional([
'meta' => [
'query' => $needle,
],
]);
}
try {
$contacts = auth()->user()->account->contacts()
->real()
->active()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ContactResource::collection($contacts);
}
/**
* Get the detail of a given contact.
*
* @param Request $request
* @param int $id
* @return ContactResource|JsonResponse
*/
public function show(Request $request, int $id)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
UpdateLastConsultedDate::dispatch($contact);
return new ContactResource($contact);
}
/**
* Store the contact.
*
* @param Request $request
* @return ContactResource|JsonResponse
*/
public function store(Request $request)
{
try {
$contact = app(CreateContact::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
'author_id' => auth()->user()->id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
/**
* Update the contact.
*
* @param Request $request
* @return ContactResource|JsonResponse
*/
public function update(Request $request, $contactId)
{
try {
$contact = app(UpdateContact::class)->execute(
$request->except(['account_id', 'contact_id'])
+
[
'contact_id' => $contactId,
'account_id' => auth()->user()->account_id,
'author_id' => auth()->user()->id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
/**
* Delete a contact.
*
* @param Request $request
* @return JsonResponse
*/
public function destroy(Request $request, $contactId)
{
$data = [
'account_id' => auth()->user()->account_id,
'contact_id' => $contactId,
];
DestroyContact::dispatch($data);
return $this->respondObjectDeleted($contactId);
}
/**
* Set the contact career.
*
* @param Request $request
* @param int $contactId
* @return ContactResource|JsonResponse
*/
public function updateWork(Request $request, $contactId)
{
try {
$contact = app(UpdateWorkInformation::class)->execute(
$request->except(['account_id', 'contact_id'])
+ [
'contact_id' => $contactId,
'account_id' => auth()->user()->account_id,
'author_id' => auth()->user()->id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
/**
* Set the contact food preferences.
*
* @param Request $request
* @param int $contactId
* @return ContactResource|JsonResponse
*/
public function updateFoodPreferences(Request $request, $contactId)
{
try {
$contact = app(UpdateContactFoodPreferences::class)->execute(
$request->except(['account_id', 'contact_id'])
+ [
'contact_id' => $contactId,
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
/**
* Set how you met the contact.
*
* @param Request $request
* @param int $contactId
* @return ContactResource|JsonResponse
*/
public function updateIntroduction(Request $request, $contactId)
{
try {
$contact = app(UpdateContactIntroduction::class)->execute(
$request->except(['account_id', 'contact_id'])
+ [
'contact_id' => $contactId,
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
}

View File

@@ -0,0 +1,140 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Models\Contact\ContactField;
use Illuminate\Database\QueryException;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Contact\ContactField\CreateContactField;
use App\Services\Contact\ContactField\UpdateContactField;
use App\Services\Contact\ContactField\DestroyContactField;
use App\Http\Resources\ContactField\ContactField as ContactFieldResource;
class ApiContactFieldController extends ApiController
{
/**
* Get the detail of a given contactField.
*
* @param Request $request
* @param int $contactFieldId
* @return ContactFieldResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $contactFieldId)
{
try {
$contactField = ContactField::where('account_id', auth()->user()->account_id)
->findOrFail($contactFieldId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ContactFieldResource($contactField);
}
/**
* Store the contactField.
*
* @param Request $request
* @return ContactFieldResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$contactField = app(CreateContactField::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactFieldResource($contactField);
}
/**
* Update the contactField.
*
* @param Request $request
* @param int $contactFieldId
* @return ContactFieldResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $contactFieldId)
{
try {
$contactField = app(UpdateContactField::class)->execute(
$request->except(['account_id', 'address_id'])
+
[
'account_id' => auth()->user()->account_id,
'contact_field_id' => $contactFieldId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactFieldResource($contactField);
}
/**
* Delete a contactField.
*
* @param Request $request
* @param int $contactFieldId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $contactFieldId)
{
try {
app(DestroyContactField::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_field_id' => $contactFieldId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($contactFieldId);
}
/**
* Get the list of contact fields for the given contact.
*
* @param Request $request
* @param int $contactId
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function contactFields(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$contactFields = $contact->contactFields()
->paginate($this->getLimitPerPage());
return ContactFieldResource::collection($contactFields);
}
}

View File

@@ -0,0 +1,129 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Tag;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Services\Contact\Tag\DetachTag;
use Illuminate\Support\Facades\Validator;
use App\Services\Contact\Tag\AssociateTag;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Contact\Contact as ContactResource;
class ApiContactTagController extends ApiController
{
/**
* Associate one or more tags to the contact.
*
* @param Request $request
* @param int $contactId
*/
public function setTags(Request $request, $contactId)
{
$contact = $this->validateTag($request, $contactId);
if (! $contact instanceof Contact) {
return $contact;
}
$tags = collect($request->input('tags'))
->filter(function ($tag) {
return ! empty($tag);
});
foreach ($tags as $tag) {
app(AssociateTag::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_id' => $contact->id,
'name' => $tag,
]);
}
return new ContactResource($contact);
}
/**
* Remove all the tags associated with the contact.
*
* @param Request $request
* @param int $contactId
*/
public function unsetTags(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$contactTags = $contact->tags()->get();
foreach ($contactTags as $tag) {
app(DetachTag::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_id' => $contact->id,
'tag_id' => $tag->id,
]);
}
return new ContactResource($contact);
}
/**
* Remove one or more specific tags associated with the contact.
*
* @param Request $request
* @param int $contactId
*/
public function unsetTag(Request $request, $contactId)
{
$contact = $this->validateTag($request, $contactId);
if (! $contact instanceof Contact) {
return $contact;
}
$tags = collect($request->input('tags'))
->filter(function ($tag) {
return ! empty($tag);
});
foreach ($tags as $tag) {
app(DetachTag::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_id' => $contact->id,
'tag_id' => $tag,
]);
}
return new ContactResource($contact);
}
/**
* Validate the request for update tag.
*
* @param Request $request
* @param int $contactId
* @return mixed
*/
private function validateTag(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->findOrFail($contactId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$validator = Validator::make($request->all(), [
'tags' => 'required|array',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
return $contact;
}
}

View File

@@ -0,0 +1,207 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use function Safe\json_decode;
use App\Models\Account\ApiUsage;
use App\Http\Controllers\Controller;
use App\Traits\JsonRespondController;
class ApiController extends Controller
{
use JsonRespondController;
/**
* @var int
*/
protected $limitPerPage = 0;
/**
* @var string
*/
protected $sort = 'created_at';
/**
* @var string
*/
protected $withParameter = null;
/**
* @var string
*/
protected $sortDirection = 'asc';
public function __construct()
{
$this->middleware(function ($request, $next) {
(new ApiUsage)->log($request);
if ($request->has('sort')) {
$this->setSortCriteria($request->input('sort'));
// It has a sort criteria, but is it a valid one?
if (empty($this->getSortCriteria())) {
return $this->setHTTPStatusCode(400)
->setErrorCode(39)
->respondWithError();
}
}
if ($request->has('limit')) {
if ($request->input('limit') > config('api.max_limit_per_page')) {
return $this->setHTTPStatusCode(400)
->setErrorCode(30)
->respondWithError();
}
$this->setLimitPerPage($request->input('limit'));
}
if ($request->has('with')) {
$this->setWithParameter($request->input('with'));
}
// make sure the JSON is well formatted if the call sends a JSON
// if the call contains a JSON, the call must not be a GET or
// a DELETE
// TODO: there is probably a much better way to do that
try {
if ($request->method() != 'GET' && $request->method() != 'DELETE'
&& is_null(json_decode($request->getContent()))) {
return $this->setHTTPStatusCode(400)
->setErrorCode(37)
->respondWithError();
}
} catch (\Safe\Exceptions\JsonException $e) {
// no error
}
return $next($request);
});
}
/**
* Default request to the API.
*
* @return \Illuminate\Http\JsonResponse
*/
public function success()
{
return $this->respond([
'success' => [
'message' => 'Welcome to Monica',
],
'links' => [
'activities_url' => route('api.activities'),
'addresses_url' => route('api.addresses'),
'calls_url' => route('api.calls'),
'contacts_url' => route('api.contacts'),
'conversations_url' => route('api.conversations'),
'countries_url' => route('api.countries'),
'currencies_url' => route('api.currencies'),
'documents_url' => route('api.documents'),
'journal_url' => route('api.journal'),
'notes_url' => route('api.notes'),
'relationships_url' => route('api.relationships', ['contact' => ':contactId']),
'reminders_url' => route('api.reminders'),
'statistics_url' => route('api.statistics'),
],
]);
}
/**
* @return string
*/
public function getWithParameter()
{
return $this->withParameter;
}
/**
* @param string $with
* @return self
*/
public function setWithParameter($with)
{
$this->withParameter = $with;
return $this;
}
/**
* @return int
*/
public function getLimitPerPage()
{
return $this->limitPerPage;
}
/**
* @param int $limit
* @return self
*/
public function setLimitPerPage($limit)
{
$this->limitPerPage = $limit;
return $this;
}
/**
* Get the sort direction parameter.
*
* @return string
*/
public function getSortDirection()
{
return $this->sortDirection;
}
/**
* @return string
*/
public function getSortCriteria()
{
return $this->sort;
}
/**
* @param string $criteria
* @return self
*/
public function setSortCriteria($criteria)
{
$acceptedCriteria = [
'created_at',
'updated_at',
'-created_at',
'-updated_at',
'completed_at',
'-completed_at',
'called_at',
'-called_at',
'favorited_at',
'-favorited_at',
];
if (in_array($criteria, $acceptedCriteria)) {
$this->setSQLOrderByQuery($criteria);
return $this;
}
$this->sort = '';
return $this;
}
/**
* Set both the column and order necessary to perform an orderBy.
*/
public function setSQLOrderByQuery($criteria)
{
$this->sortDirection = $criteria[0] == '-' ? 'desc' : 'asc';
$this->sort = ltrim($criteria, '-');
}
}

View File

@@ -0,0 +1,191 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Debt;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use Illuminate\Validation\Rule;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\Debt\Debt as DebtResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiDebtController extends ApiController
{
/**
* Get the list of debts.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$debts = auth()->user()->account->debts()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return DebtResource::collection($debts);
}
/**
* Get the detail of a given debt.
*
* @param Request $request
* @return DebtResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $debtId)
{
try {
$debt = Debt::where('account_id', auth()->user()->account_id)
->where('id', $debtId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new DebtResource($debt);
}
/**
* Store the debt.
*
* @param Request $request
* @return DebtResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$debt = Debt::create(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new DebtResource($debt);
}
/**
* Update the debt.
*
* @param Request $request
* @param int $debtId
* @return DebtResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $debtId)
{
try {
$debt = Debt::where('account_id', auth()->user()->account_id)
->where('id', $debtId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$debt->update($request->only(['in_debt', 'status', 'amount', 'reason', 'contact_id']));
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new DebtResource($debt);
}
/**
* Validate the request for update.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateUpdate(Request $request)
{
// Validates basic fields to create the entry
$validator = Validator::make($request->all(), [
'in_debt' => [
'required',
'string',
Rule::in(['yes', 'no']),
],
'status' => [
'required',
'string',
Rule::in(['inprogress', 'completed']),
],
'amount' => 'required|numeric',
'reason' => 'string|max:1000000|nullable',
'contact_id' => 'required|integer',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
try {
Contact::where('account_id', auth()->user()->account_id)
->where('id', $request->input('contact_id'))
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return true;
}
/**
* Delete a debt.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $debtId)
{
try {
$debt = Debt::where('account_id', auth()->user()->account_id)
->where('id', $debtId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$debt->delete();
return $this->respondObjectDeleted($debt->id);
}
/**
* Get the list of debts for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function debts(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$debts = $contact->debts()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return DebtResource::collection($debts);
}
}

View File

@@ -0,0 +1,174 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Gift;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use App\Services\Contact\Gift\CreateGift;
use App\Services\Contact\Gift\UpdateGift;
use App\Services\Contact\Gift\DestroyGift;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Gift\Gift as GiftResource;
use App\Services\Contact\Gift\AssociatePhotoToGift;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiGiftController extends ApiController
{
/**
* Get the list of gifts.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$gifts = auth()->user()->account->gifts()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return GiftResource::collection($gifts);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
}
/**
* Get the detail of a given gift.
*
* @param Request $request
* @return GiftResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$gift = Gift::where('account_id', auth()->user()->account_id)
->findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new GiftResource($gift);
}
/**
* Store the gift.
*
* @param Request $request
* @return GiftResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$gift = app(CreateGift::class)->execute(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
return new GiftResource($gift);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
}
/**
* Update the gift.
*
* @param Request $request
* @param int $giftId
* @return GiftResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $giftId)
{
try {
$gift = app(UpdateGift::class)->execute(
$request->except(['account_id', 'gift_id'])
+ [
'account_id' => auth()->user()->account_id,
'gift_id' => $giftId,
]
);
return new GiftResource($gift);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
}
/**
* Associate a photo to the gift.
*
* @param Request $request
* @param int $giftId
* @param int $photoId
* @return GiftResource|\Illuminate\Http\JsonResponse
*/
public function associate(Request $request, $giftId, $photoId)
{
try {
$gift = app(AssociatePhotoToGift::class)->execute([
'account_id' => auth()->user()->account_id,
'gift_id' => $giftId,
'photo_id' => $photoId,
]);
return new GiftResource($gift);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
}
/**
* Delete a gift.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $giftId)
{
try {
app(DestroyGift::class)->execute([
'account_id' => auth()->user()->account_id,
'gift_id' => $giftId,
]);
return $this->respondObjectDeleted($giftId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
}
/**
* Get the list of gifts for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function gifts(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->findOrFail($contactId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$gifts = $contact->gifts()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return GiftResource::collection($gifts);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Journal\Entry;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\Journal\Entry as JournalResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiJournalController extends ApiController
{
/**
* Get the list of journal entries.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$entries = auth()->user()->account->entries()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return JournalResource::collection($entries);
}
/**
* Get the detail of a given journal entry.
*
* @param Request $request
* @return JournalResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $entryId)
{
try {
$entry = Entry::where('account_id', auth()->user()->account_id)
->where('id', $entryId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new JournalResource($entry);
}
/**
* Store the call.
*
* @param Request $request
* @return JournalResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$entry = Entry::create(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new JournalResource($entry);
}
/**
* Update the note.
*
* @param Request $request
* @param int $entryId
* @return JournalResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $entryId)
{
try {
$entry = Entry::where('account_id', auth()->user()->account_id)
->where('id', $entryId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$entry->update($request->only(['title', 'post']));
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new JournalResource($entry);
}
/**
* Validate the request for update.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateUpdate(Request $request)
{
// Validates basic fields to create the entry
$validator = Validator::make($request->all(), [
'title' => 'required|max:255',
'post' => 'required|max:1000000',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
return true;
}
/**
* Delete a journal entry.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $entryId)
{
try {
$entry = Entry::where('account_id', auth()->user()->account_id)
->where('id', $entryId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$entry->delete();
return $this->respondObjectDeleted($entry->id);
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Services\Contact\Contact\SetMeContact;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Contact\DeleteMeContact;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiMeController extends ApiController
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('limitations')->only('store');
parent::__construct();
}
/**
* Set a contact as 'me'.
*
* @param Request $request
* @return string
*/
public function store(Request $request)
{
$data = [
'contact_id' => $request->input('contact_id'),
'account_id' => auth()->user()->account_id,
'user_id' => auth()->user()->id,
];
try {
app(SetMeContact::class)->execute($data);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return $this->respond(['true']);
}
/**
* Removes contact as 'me' association.
*
* @param Request $request
* @return string
*/
public function destroy(Request $request)
{
$data = [
'account_id' => auth()->user()->account_id,
'user_id' => auth()->user()->id,
];
app(DeleteMeContact::class)->execute($data);
return $this->respond(['true']);
}
}

View File

@@ -0,0 +1,192 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Note;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\Note\Note as NoteResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiNoteController extends ApiController
{
/**
* Get the list of notes.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$notes = auth()->user()->account->notes()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return NoteResource::collection($notes);
}
/**
* Get the detail of a given note.
*
* @param Request $request
* @return NoteResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$note = Note::where('account_id', auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new NoteResource($note);
}
/**
* Store the note.
*
* @param Request $request
* @return NoteResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$note = Note::create(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
if ($request->input('is_favorited')) {
$note->favorited_at = now();
$note->save();
}
return new NoteResource($note);
}
/**
* Update the note.
*
* @param Request $request
* @param int $noteId
* @return NoteResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $noteId)
{
try {
$note = Note::where('account_id', auth()->user()->account_id)
->where('id', $noteId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$note->update($request->only(['body', 'contact_id', 'is_favorited']));
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
if ($request->input('is_favorited')) {
$note->favorited_at = now();
} else {
$note->favorited_at = null;
}
$note->save();
return new NoteResource($note);
}
/**
* Validate the request for update.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateUpdate(Request $request)
{
// Validates basic fields to create the entry
$validator = Validator::make($request->all(), [
'body' => 'required|max:100000',
'contact_id' => 'required|integer',
'is_favorited' => 'boolean',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
try {
Contact::where('account_id', auth()->user()->account_id)
->where('id', $request->input('contact_id'))
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return true;
}
/**
* Delete a note.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $noteId)
{
try {
$note = Note::where('account_id', auth()->user()->account_id)
->where('id', $noteId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$note->delete();
return $this->respondObjectDeleted($note->id);
}
/**
* Get the list of notes for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function notes(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$notes = $contact->notes()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return NoteResource::collection($notes);
}
}

View File

@@ -0,0 +1,182 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Pet;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\Pet\Pet as PetResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiPetController extends ApiController
{
/**
* Get the list of pet.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$pets = Pet::where('account_id', auth()->user()->account_id)
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return PetResource::collection($pets);
}
/**
* Get the detail of a given pet.
*
* @param Request $request
* @return PetResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$pet = Pet::where('account_id', auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new PetResource($pet);
}
/**
* Store the pet.
*
* @param Request $request
* @return PetResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$pet = Pet::create(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new PetResource($pet);
}
/**
* Update the pet.
*
* @param Request $request
* @param int $petId
* @return PetResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $petId)
{
try {
$pet = Pet::where('account_id', auth()->user()->account_id)
->where('id', $petId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$pet->update($request->only(['pet_category_id', 'contact_id', 'name']));
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new PetResource($pet);
}
/**
* Validate the request for update.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateUpdate(Request $request)
{
// Validates basic fields to create the entry
$validator = Validator::make($request->all(), [
'pet_category_id' => 'integer|required|exists:pet_categories,id',
'contact_id' => 'required|integer',
'name' => 'max:255',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
try {
Contact::where('account_id', auth()->user()->account_id)
->where('id', $request->input('contact_id'))
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return true;
}
/**
* Delete a pet.
*
* @param Request $request
* @param int $petId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $petId)
{
try {
$pet = Pet::where('account_id', auth()->user()->account_id)
->where('id', $petId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$pet->delete();
return $this->respondObjectDeleted($pet->id);
}
/**
* Get the list of pets for the given contact.
*
* @param Request $request
* @param int $contactId
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function pets(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$pets = $contact->pets()
->paginate($this->getLimitPerPage());
return PetResource::collection($pets);
}
}

View File

@@ -0,0 +1,124 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Models\Relationship\Relationship;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Contact\Relationship\CreateRelationship;
use App\Services\Contact\Relationship\UpdateRelationship;
use App\Services\Contact\Relationship\DestroyRelationship;
use App\Http\Resources\Relationship\Relationship as RelationshipResource;
class ApiRelationshipController extends ApiController
{
/**
* Get all of relationships of a contact.
*
* @param Request $request
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request, $contactId)
{
try {
$relationships = Relationship::where('account_id', auth()->user()->account_id)
->where('contact_is', $contactId)
->get();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return RelationshipResource::collection($relationships);
}
/**
* Get the detail of a given relationship.
*
* @param Request $request
* @return RelationshipResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$relationship = Relationship::where('account_id', auth()->user()->account_id)
->findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new RelationshipResource($relationship);
}
/**
* Create a new relationship.
*
* @param Request $request
* @return RelationshipResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$relationship = app(CreateRelationship::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_is' => $request->input('contact_is'),
'of_contact' => $request->input('of_contact'),
'relationship_type_id' => $request->input('relationship_type_id'),
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new RelationshipResource($relationship);
}
/**
* Update an existing relationship.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|RelationshipResource
*/
public function update(Request $request, $relationshipId)
{
try {
$relationship = app(UpdateRelationship::class)->execute([
'account_id' => auth()->user()->account_id,
'relationship_id' => $relationshipId,
'relationship_type_id' => $request->input('relationship_type_id'),
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
$relationship->refresh();
return new RelationshipResource($relationship);
}
/**
* Delete a relationship.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $relationshipId)
{
try {
app(DestroyRelationship::class)->execute([
'account_id' => auth()->user()->account_id,
'relationship_id' => $relationshipId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return $this->respondObjectDeleted($relationshipId);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Relationship\RelationshipType;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\RelationshipType\RelationshipType as RelationshipTypeResource;
class ApiRelationshipTypeController extends ApiController
{
/**
* Get all relationship types in an instance.
*
* @param Request $request
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$relationshipTypes = auth()->user()->account->relationshipTypes()
->paginate($this->getLimitPerPage());
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return RelationshipTypeResource::collection($relationshipTypes);
}
/**
* Get the detail of a given relationship type.
*
* @param Request $request
* @return RelationshipTypeResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$relationshipType = RelationshipType::where('account_id', auth()->user()->account_id)
->findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new RelationshipTypeResource($relationshipType);
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Relationship\RelationshipTypeGroup;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\RelationshipTypeGroup\RelationshipTypeGroup as RelationshipTypeGroupResource;
class ApiRelationshipTypeGroupController extends ApiController
{
/**
* Account ID column name.
*/
const ACCOUNT_ID = 'account_id';
/**
* Get all relationship type groups in an instance.
*
* @param Request $request
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$relationshipTypeGroups = auth()->user()->account->relationshipTypeGroups()
->paginate($this->getLimitPerPage());
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return RelationshipTypeGroupResource::collection($relationshipTypeGroups);
}
/**
* Get the detail of a given relationship type group.
*
* @param Request $request
* @return RelationshipTypeGroupResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$relationshipTypeGroup = RelationshipTypeGroup::where(static::ACCOUNT_ID, auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new RelationshipTypeGroupResource($relationshipTypeGroup);
}
}

View File

@@ -0,0 +1,182 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Helpers\AccountHelper;
use App\Models\Contact\Contact;
use App\Models\Contact\Reminder;
use Illuminate\Database\QueryException;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Reminder\CreateReminder;
use App\Services\Contact\Reminder\UpdateReminder;
use App\Services\Contact\Reminder\DestroyReminder;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Reminder\Reminder as ReminderResource;
use App\Http\Resources\Reminder\ReminderOutbox as ReminderOutboxResource;
class ApiReminderController extends ApiController
{
/**
* Get the list of reminders.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$reminders = auth()->user()->account->reminders()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ReminderResource::collection($reminders);
}
/**
* Get the detail of a given reminder.
*
* @param Request $request
* @return ReminderResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $reminderId)
{
try {
$reminder = Reminder::where('account_id', auth()->user()->account_id)
->where('id', $reminderId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ReminderResource($reminder);
}
/**
* Store the reminder.
*
* @param Request $request
* @return ReminderResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$reminder = app(CreateReminder::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ReminderResource($reminder);
}
/**
* Update the reminder.
*
* @param Request $request
* @param int $reminderId
* @return ReminderResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $reminderId)
{
try {
$reminder = app(UpdateReminder::class)->execute(
$request->except(['account_id', 'reminder_id'])
+
[
'account_id' => auth()->user()->account_id,
'reminder_id' => $reminderId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ReminderResource($reminder);
}
/**
* Delete a reminder.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $reminderId)
{
try {
app(DestroyReminder::class)->execute([
'account_id' => auth()->user()->account_id,
'reminder_id' => $reminderId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($reminderId);
}
/**
* Get the list of reminders for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function reminders(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$reminders = $contact->reminders()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return ReminderResource::collection($reminders);
}
/**
* Get the reminders for the month given in parameter.
* - 0 means current month
* - 1 means month+1
* - 2 means month+2...
*
* @param Request $request
* @param int $month
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function upcoming(Request $request, int $month = 0)
{
try {
$reminders = AccountHelper::getUpcomingRemindersForMonth(
auth()->user()->account,
$month
);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ReminderOutboxResource::collection($reminders);
}
}

View File

@@ -0,0 +1,157 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Tag;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Services\Contact\Tag\CreateTag;
use App\Services\Contact\Tag\UpdateTag;
use Illuminate\Database\QueryException;
use App\Services\Contact\Tag\DestroyTag;
use Illuminate\Database\Eloquent\Builder;
use App\Http\Resources\Tag\Tag as TagResource;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use App\Http\Resources\Contact\ContactWithContactFields as ContactWithContactFieldsResource;
class ApiTagController extends ApiController
{
/**
* Get the list of the contacts.
* We will only retrieve the contacts that are "real", not the partials
* ones.
*
* @return AnonymousResourceCollection|JsonResponse
*/
public function index(Request $request)
{
try {
$tags = auth()->user()->account->tags()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return TagResource::collection($tags);
}
/**
* Get the detail of a given tag.
*
* @param Request $request
* @return TagResource|JsonResponse
*/
public function show(Request $request, $id)
{
try {
$tag = Tag::where('account_id', auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new TagResource($tag);
}
/**
* Store the tag.
*
* @param Request $request
* @return TagResource|JsonResponse
*/
public function store(Request $request)
{
try {
$tag = app(CreateTag::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new TagResource($tag);
}
/**
* Update the tag.
*
* @param Request $request
* @param int $id
* @return TagResource|JsonResponse
*/
public function update(Request $request, int $id)
{
try {
$tag = app(UpdateTag::class)->execute(
$request->except(['account_id', 'tag_id'])
+
[
'tag_id' => $id,
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new TagResource($tag);
}
/**
* Delete a tag.
*
* @param Request $request
* @return JsonResponse
*/
public function destroy(Request $request, $id)
{
try {
app(DestroyTag::class)->execute([
'tag_id' => $id,
'account_id' => auth()->user()->account_id,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return $this->respondObjectDeleted($id);
}
/**
* Show all the contacts for a given tag.
*
* @param Request $request
* @param int $tagId
* @return JsonResponse|AnonymousResourceCollection
*/
public function contacts(Request $request, int $tagId)
{
try {
$contacts = auth()->user()->account->contacts()
->real()
->active()
->whereHas('tags', function (Builder $query) use ($tagId) {
$query->where('id', $tagId);
})
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ContactWithContactFieldsResource::collection($contacts);
}
}

View File

@@ -0,0 +1,149 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Contact\Task;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Services\Task\CreateTask;
use App\Services\Task\UpdateTask;
use App\Services\Task\DestroyTask;
use Illuminate\Database\QueryException;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Task\Task as TaskResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiTaskController extends ApiController
{
/**
* Get the list of task.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$tasks = auth()->user()->account->tasks()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return TaskResource::collection($tasks);
}
/**
* Get the detail of a given task.
*
* @param Request $request
* @return TaskResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $taskId)
{
try {
$task = Task::where('account_id', auth()->user()->account_id)
->where('id', $taskId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new TaskResource($task);
}
/**
* Store the task.
*
* @param Request $request
* @return TaskResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$task = app(CreateTask::class)->execute([
'account_id' => auth()->user()->account_id,
'contact_id' => ($request->input('contact_id') == '' ? null : $request->input('contact_id')),
'title' => $request->input('title'),
'description' => ($request->input('description') == '' ? null : $request->input('description')),
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new TaskResource($task);
}
/**
* Update the task.
*
* @param Request $request
* @param int $taskId
* @return TaskResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $taskId)
{
try {
$task = app(UpdateTask::class)->execute(
$request->except(['account_id', 'task_id'])
+
[
'task_id' => $taskId,
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new TaskResource($task);
}
/**
* Delete a task.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $taskId)
{
try {
app(DestroyTask::class)->execute([
'task_id' => $taskId,
'account_id' => auth()->user()->account_id,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return $this->respondObjectDeleted($taskId);
}
/**
* Get the list of tasks for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function tasks(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$tasks = $contact->tasks()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return TaskResource::collection($tasks);
}
}

View File

@@ -0,0 +1,212 @@
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Models\User\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use function Safe\json_decode;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\App;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Traits\JsonRespondController;
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Support\Facades\Route;
use Barryvdh\Debugbar\Facades\Debugbar;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Encryption\Encrypter;
use Symfony\Component\HttpFoundation\Response;
class OAuthController extends Controller
{
use JsonRespondController;
/**
* The encrypter implementation.
*
* @var \Illuminate\Contracts\Encryption\Encrypter
*/
protected $encrypter;
/**
* Create a new controller instance.
*
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
* @return void
*/
public function __construct(Encrypter $encrypter)
{
$this->encrypter = $encrypter;
if (config('app.debug')) {
Debugbar::disable();
}
}
/**
* Display a log in form for oauth accessToken.
*
* @param Request $request
* @return \Illuminate\View\View
*/
public function index(Request $request)
{
$request->session()->flush();
return view('auth.oauthlogin');
}
/**
* Log in a user and returns an accessToken.
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response|null
*/
public function login(Request $request): ?Response
{
$isvalid = $this->validateRequest($request);
if ($isvalid !== true) {
return $isvalid;
}
$email = $request->input('email');
$password = $request->input('password');
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// The user is active, not suspended, and exists.
$request->session()->put('oauth', true);
$request->session()->put('email', $email);
$request->session()->put('password', $this->encrypter->encrypt($password));
$this->fixRequest($request);
// add intendedUrl for WebAuthn
Redirect::setIntendedUrl(route('oauth.verify'));
return Route::respondWithRoute('oauth.verify');
}
return $this->respondUnauthorized();
}
/**
* Fix request parameters.
*
* @param Request $request
* @return void
*/
private function fixRequest(Request $request)
{
$request->setMethod('GET');
$cookie = $request->cookies->get(config('session.cookie'));
$request->cookies->set(config('session.cookie'), $this->encrypter->encrypt($cookie));
}
/**
* Validate the request.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateRequest(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'email|required',
'password' => 'required',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
// Check if email exists. If not respond with an Unauthorized, this way a hacker
// doesn't know if the login email exist or not, or if the password is wrong
$count = User::where('email', $request->input('email'))->count();
if ($count === 0) {
return $this->respondUnauthorized();
}
return true;
}
/**
* Log in a user and returns an accessToken.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function verify(Request $request): JsonResponse
{
$response = $this->handleVerify($request);
Auth::logout();
$request->session()->flush();
return $response ?: $this->respondUnauthorized();
}
/**
* Handle the verify request.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|null
*/
private function handleVerify(Request $request): ?JsonResponse
{
if (! $request->session()->has('email') || ! $request->session()->has('password')) {
return null;
}
$request->query->set('email', $request->session()->pull('email'));
$request->query->set('password', $this->encrypter->decrypt($request->session()->pull('password')));
$isvalid = $this->validateRequest($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$token = $this->proxy([
'username' => $request->input('email'),
'password' => $request->input('password'),
'grantType' => 'password',
]);
return $this->respond($token);
} catch (\Exception $e) {
return null;
}
}
/**
* Proxy a request to the OAuth server.
*
* @param array $data the data to send to the server
* @return array
*
* @throws \Safe\Exceptions\JsonException
*/
private function proxy(array $data = []): array
{
$url = App::runningUnitTests() ? Str::of(config('app.url'))->ltrim('/').'/oauth/token' : route('passport.token');
/** @var \Illuminate\Http\Response */
$response = app(Kernel::class)->handle(Request::create($url, 'POST', [
'grant_type' => $data['grantType'],
'client_id' => config('passport.password_grant_client.id'),
'client_secret' => config('passport.password_grant_client.secret'),
'username' => $data['username'],
'password' => $data['password'],
'scope' => '',
]));
$data = json_decode($response->content());
return [
'access_token' => $data->access_token,
'expires_in' => $data->expires_in,
];
}
}

View File

@@ -0,0 +1,156 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Address;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Address\CreateAddress;
use App\Services\Contact\Address\UpdateAddress;
use App\Services\Contact\Address\DestroyAddress;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Address\Address as AddressResource;
class ApiAddressController extends ApiController
{
/**
* Get the list of addresses.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$addresses = auth()->user()->account->addresses()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return AddressResource::collection($addresses);
}
/**
* Get the detail of a given address.
*
* @param Request $request
* @return AddressResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
try {
$address = Address::where('account_id', auth()->user()->account_id)
->where('id', $id)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new AddressResource($address);
}
/**
* Store the address.
*
* @param Request $request
* @return AddressResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$address = app(CreateAddress::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new AddressResource($address);
}
/**
* Update the address.
*
* @param Request $request
* @param int $addressId
* @return AddressResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $addressId)
{
try {
$address = app(UpdateAddress::class)->execute(
$request->except(['account_id', 'address_id'])
+
[
'account_id' => auth()->user()->account_id,
'address_id' => $addressId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new AddressResource($address);
}
/**
* Delete an address.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $addressId)
{
try {
app(DestroyAddress::class)->execute([
'account_id' => auth()->user()->account_id,
'address_id' => $addressId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($addressId);
}
/**
* Get the list of addresses for the given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function addresses(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$addresses = $contact->addresses()
->paginate($this->getLimitPerPage());
return AddressResource::collection($addresses);
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use Illuminate\Http\JsonResponse;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\AuditLog\AuditLog as AuditLogResource;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
class ApiAuditLogController extends ApiController
{
/**
* Get the list of the audit logs for the given contact.
*
* @param Request $request
* @param int $contactId
* @return JsonResponse|AnonymousResourceCollection
*/
public function index(Request $request, int $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$logs = $contact->logs()
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return AuditLogResource::collection($logs);
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Services\Contact\Avatar\UpdateAvatar;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Contact\Contact as ContactResource;
class ApiAvatarController extends ApiController
{
/**
* Update a contact's avatar.
*
* @param Request $request
* @param int $contactId
* @return ContactResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $contactId)
{
try {
$contact = app(UpdateAvatar::class)->execute(
$request->except(['account_id', 'contact_id'])
+
[
'account_id' => auth()->user()->account_id,
'contact_id' => $contactId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ContactResource($contact);
}
}

View File

@@ -0,0 +1,162 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use App\Models\Contact\Call;
use Illuminate\Http\Request;
use App\Helpers\AccountHelper;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use App\Services\Contact\Call\CreateCall;
use App\Services\Contact\Call\UpdateCall;
use App\Services\Contact\Call\DestroyCall;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Call\Call as CallResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiCallController extends ApiController
{
/**
* Get the list of calls.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$calls = auth()->user()->account->calls()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return CallResource::collection($calls)->additional(['meta' => [
'statistics' => AccountHelper::getYearlyCallStatistics(auth()->user()->account),
]]);
}
/**
* Get the detail of a given call.
*
* @param Request $request
* @return CallResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $callId)
{
try {
$call = Call::where('account_id', auth()->user()->account_id)
->where('id', $callId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new CallResource($call);
}
/**
* Store the call.
*
* @param Request $request
* @return CallResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$call = app(CreateCall::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new CallResource($call);
}
/**
* Update a call.
*
* @param Request $request
* @param int $callId
* @return CallResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $callId)
{
try {
$call = app(UpdateCall::class)->execute(
$request->except(['account_id', 'call_id'])
+
[
'account_id' => auth()->user()->account_id,
'call_id' => $callId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new CallResource($call);
}
/**
* Delete a call.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $callId)
{
try {
app(DestroyCall::class)->execute([
'account_id' => auth()->user()->account_id,
'call_id' => $callId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($callId);
}
/**
* Get the list of calls for a given contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function calls(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$calls = $contact->calls()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return CallResource::collection($calls)->additional(['meta' => [
'statistics' => AccountHelper::getYearlyCallStatistics(auth()->user()->account),
]]);
}
}

View File

@@ -0,0 +1,162 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Models\Contact\Conversation;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Contact\Conversation\CreateConversation;
use App\Services\Contact\Conversation\UpdateConversation;
use App\Services\Contact\Conversation\DestroyConversation;
use App\Http\Resources\Conversation\Conversation as ConversationResource;
class ApiConversationController extends ApiController
{
/**
* Get the list of conversations.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$conversations = auth()->user()->account->conversations()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ConversationResource::collection($conversations);
}
/**
* Get the list of conversations for a specific contact.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function conversations(Request $request, $contactId)
{
try {
Contact::where('account_id', auth()->user()->account_id)
->where('id', $contactId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$conversations = auth()->user()->account->conversations()
->where('contact_id', $contactId)
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return ConversationResource::collection($conversations);
}
/**
* Get the detail of a given conversation.
*
* @param Request $request
* @return ConversationResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $conversationId)
{
try {
$conversation = Conversation::where('account_id', auth()->user()->account_id)
->findOrFail($conversationId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ConversationResource($conversation);
}
/**
* Store the conversation.
*
* @param Request $request
* @return ConversationResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$conversation = app(CreateConversation::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ConversationResource($conversation);
}
/**
* Update the conversation.
*
* @param Request $request
* @param int $conversationId
* @return ConversationResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $conversationId)
{
try {
$conversation = app(UpdateConversation::class)->execute(
$request->except(['account_id', 'conversation_id'])
+
[
'account_id' => auth()->user()->account_id,
'conversation_id' => $conversationId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ConversationResource($conversation);
}
/**
* Destroy the conversation.
*
* @param Request $request
* @param int $conversationId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $conversationId)
{
try {
app(DestroyConversation::class)->execute([
'account_id' => auth()->user()->account_id,
'conversation_id' => $conversationId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($conversationId);
}
}

View File

@@ -0,0 +1,146 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Contact;
use App\Models\Contact\Document;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Document\UploadDocument;
use App\Services\Contact\Document\DestroyDocument;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Document\Document as DocumentResource;
class ApiDocumentController extends ApiController
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('limitations')->only('store');
parent::__construct();
}
/**
* Get the list of documents.
*
* @param Request $request
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$documents = auth()->user()->account->documents()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return DocumentResource::collection($documents);
}
/**
* Get the list of documents for a specific contact.
*
* @param Request $request
* @param int $contactId
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function contact(Request $request, $contactId)
{
try {
Contact::where('account_id', auth()->user()->account_id)
->findOrFail($contactId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$documents = auth()->user()->account->documents()
->where('contact_id', $contactId)
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return DocumentResource::collection($documents);
}
/**
* Get the detail of a given document.
*
* @param Request $request
* @param int $documentId
* @return DocumentResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $documentId)
{
try {
$document = Document::where('account_id', auth()->user()->account_id)
->findOrFail($documentId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new DocumentResource($document);
}
/**
* Store a document.
*
* @param Request $request
* @return DocumentResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$document = app(UploadDocument::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new DocumentResource($document);
}
/**
* Destroy a document.
*
* @param Request $request
* @param int $documentId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $documentId)
{
try {
app(DestroyDocument::class)->execute([
'account_id' => auth()->user()->account_id,
'document_id' => $documentId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($documentId);
}
}

View File

@@ -0,0 +1,121 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\LifeEvent;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\LifeEvent\CreateLifeEvent;
use App\Services\Contact\LifeEvent\UpdateLifeEvent;
use App\Services\Contact\LifeEvent\DestroyLifeEvent;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\LifeEvent\LifeEvent as LifeEventResource;
class ApiLifeEventController extends ApiController
{
/**
* Get the list of life events.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index(Request $request)
{
$lifeEvents = auth()->user()->account->lifeEvents()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
return LifeEventResource::collection($lifeEvents);
}
/**
* Get the detail of a given life event.
*
* @param Request $request
* @return LifeEventResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $lifeEventId)
{
try {
$lifeEvent = LifeEvent::where('account_id', auth()->user()->account_id)
->findOrFail($lifeEventId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new LifeEventResource($lifeEvent);
}
/**
* Store the life event.
*
* @param Request $request
* @return LifeEventResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$lifeEvent = app(CreateLifeEvent::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new LifeEventResource($lifeEvent);
}
/**
* Update the life event.
*
* @param Request $request
* @param int $lifeEventId
* @return LifeEventResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $lifeEventId)
{
try {
$lifeEvent = app(UpdateLifeEvent::class)->execute(
$request->except(['account_id', 'life_event_id'])
+
[
'account_id' => auth()->user()->account_id,
'life_event_id' => $lifeEventId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
}
return new LifeEventResource($lifeEvent);
}
/**
* Destroy the life event.
*
* @param Request $request
* @param int $lifeEventId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $lifeEventId)
{
try {
app(DestroyLifeEvent::class)->execute([
'account_id' => auth()->user()->account_id,
'life_event_id' => $lifeEventId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return $this->respondObjectDeleted($lifeEventId);
}
}

View File

@@ -0,0 +1,126 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Message;
use App\Models\Contact\Conversation;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Conversation\UpdateMessage;
use App\Services\Contact\Conversation\DestroyMessage;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Services\Contact\Conversation\AddMessageToConversation;
use App\Http\Resources\Conversation\Conversation as ConversationResource;
class ApiMessageController extends ApiController
{
/**
* Store the message.
*
* @param Request $request
* @return ConversationResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request, int $conversationId)
{
try {
$conversation = Conversation::findOrFail($conversationId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
app(AddMessageToConversation::class)->execute(
$request->except(['account_id', 'conversation_id', 'contact_id'])
+
[
'account_id' => auth()->user()->account_id,
'conversation_id' => $conversation->id,
'contact_id' => $conversation->contact_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ConversationResource($conversation);
}
/**
* Update the message.
*
* @param Request $request
* @param int $conversationId
* @param int $messageId
* @return ConversationResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, int $conversationId, int $messageId)
{
try {
$conversation = Conversation::findOrFail($conversationId);
$message = Message::findOrFail($messageId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
app(UpdateMessage::class)->execute(
$request->except(['account_id', 'conversation_id', 'message_id', 'contact_id'])
+
[
'account_id' => auth()->user()->account_id,
'conversation_id' => $conversationId,
'message_id' => $message->id,
'contact_id' => $conversation->contact_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new ConversationResource($conversation);
}
/**
* Destroy the message.
*
* @param Request $request
* @param int $conversationId
* @param int $messageId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $conversationId, int $messageId)
{
try {
Conversation::findOrFail($conversationId);
Message::findOrFail($messageId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
app(DestroyMessage::class)->execute([
'account_id' => auth()->user()->account_id,
'conversation_id' => $conversationId,
'message_id' => $messageId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($messageId);
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Contact\Occupation;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Validation\ValidationException;
use App\Services\Contact\Occupation\CreateOccupation;
use App\Services\Contact\Occupation\UpdateOccupation;
use App\Services\Contact\Occupation\DestroyOccupation;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Occupation\Occupation as OccupationResource;
class ApiOccupationController extends ApiController
{
/**
* Get the list of occupations.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$occupations = auth()->user()->account->occupations()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return OccupationResource::collection($occupations);
}
/**
* Get the detail of a given occupation.
*
* @param Request $request
* @return OccupationResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $occupationId)
{
try {
$occupation = Occupation::where('account_id', auth()->user()->account_id)
->where('id', $occupationId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new OccupationResource($occupation);
}
/**
* Store the occupation.
*
* @param Request $request
* @return OccupationResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$occupation = app(CreateOccupation::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new OccupationResource($occupation);
}
/**
* Update an occupation.
*
* @param Request $request
* @param int $occupationId
* @return OccupationResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $occupationId)
{
try {
$occupation = app(UpdateOccupation::class)->execute(
$request->except(['account_id', 'occupation_id'])
+
[
'account_id' => auth()->user()->account_id,
'occupation_id' => $occupationId,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new OccupationResource($occupation);
}
/**
* Delete an occupation.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $occupationId)
{
try {
app(DestroyOccupation::class)->execute([
'account_id' => auth()->user()->account_id,
'occupation_id' => $occupationId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($occupationId);
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Http\Controllers\Api\Contact;
use Illuminate\Http\Request;
use App\Models\Account\Photo;
use App\Models\Contact\Contact;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Services\Account\Photo\UploadPhoto;
use App\Services\Account\Photo\DestroyPhoto;
use Illuminate\Validation\ValidationException;
use App\Http\Resources\Photo\Photo as PhotoResource;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class ApiPhotoController extends ApiController
{
/**
* Get the list of photos.
*
* @param Request $request
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try {
$photos = auth()->user()->account->photos()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return PhotoResource::collection($photos);
}
/**
* Get the list of photos for a specific contact.
*
* @param Request $request
* @param int $contactId
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection|\Illuminate\Http\JsonResponse
*/
public function contact(Request $request, $contactId)
{
try {
$contact = Contact::where('account_id', auth()->user()->account_id)
->findOrFail($contactId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
try {
$photos = $contact->photos()
->orderBy($this->sort, $this->sortDirection)
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return PhotoResource::collection($photos);
}
/**
* Get the detail of a given photo.
*
* @param Request $request
* @param int $photoId
* @return PhotoResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $photoId)
{
try {
$photo = Photo::where('account_id', auth()->user()->account_id)
->findOrFail($photoId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new PhotoResource($photo);
}
/**
* Store a photo.
*
* @param Request $request
* @return PhotoResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
try {
$photo = app(UploadPhoto::class)->execute(
$request->except(['account_id'])
+
[
'account_id' => auth()->user()->account_id,
]
);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return new PhotoResource($photo);
}
/**
* Destroy a photo.
*
* @param Request $request
* @param int $photoId
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, int $photoId)
{
try {
app(DestroyPhoto::class)->execute([
'account_id' => auth()->user()->account_id,
'photo_id' => $photoId,
]);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
} catch (ValidationException $e) {
return $this->respondValidatorFailed($e->validator);
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return $this->respondObjectDeleted($photoId);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Api\Misc;
use Illuminate\Http\Request;
use App\Helpers\CountriesHelper;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Cache;
use App\Http\Controllers\Api\ApiController;
use App\Http\Resources\Country\Country as CountryResource;
class ApiCountryController extends ApiController
{
/**
* Get the list of countries.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index(Request $request)
{
$key = 'countries.'.App::getLocale();
$countries = Cache::rememberForever($key, function () {
return CountriesHelper::getAll();
});
return CountryResource::collection($countries);
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\Api\Settings;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Database\QueryException;
use App\Http\Controllers\Api\ApiController;
use App\Http\Resources\AuditLog\AuditLog as AuditLogResource;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
class ApiAuditLogController extends ApiController
{
/**
* Get the list of the audit logs.
*
* @param Request $request
* @return JsonResponse|AnonymousResourceCollection
*/
public function index(Request $request)
{
try {
$logs = auth()->user()->account->auditLogs()
->paginate($this->getLimitPerPage());
} catch (QueryException $e) {
return $this->respondInvalidQuery();
}
return AuditLogResource::collection($logs);
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api\Settings;
use Illuminate\Http\Request;
use App\Models\Settings\Term;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Settings\Compliance\Compliance as ComplianceResource;
class ApiComplianceController extends ApiController
{
/**
* Get the list of terms and privacy policies.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index(Request $request)
{
$terms = Term::orderBy('term_version', 'desc')->paginate($this->getLimitPerPage());
return ComplianceResource::collection($terms);
}
/**
* Get the detail of a given term.
*
* @param Request $request
* @return ComplianceResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $termId)
{
try {
$term = Term::where('id', $termId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ComplianceResource($term);
}
}

View File

@@ -0,0 +1,163 @@
<?php
namespace App\Http\Controllers\Api\Settings;
use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Models\Contact\ContactFieldType;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Settings\ContactFieldType\ContactFieldType as ContactFieldTypeResource;
class ApiContactFieldTypeController extends ApiController
{
/**
* Get the list of contact field types.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index(Request $request)
{
$contactFieldTypes = auth()->user()->account->contactFieldTypes()
->paginate($this->getLimitPerPage());
return ContactFieldTypeResource::collection($contactFieldTypes);
}
/**
* Get the detail of a given contact field type.
*
* @param Request $request
* @return ContactFieldTypeResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $contactFieldTypeId)
{
try {
$contactFieldType = ContactFieldType::where('account_id', auth()->user()->account_id)
->where('id', $contactFieldTypeId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new ContactFieldTypeResource($contactFieldType);
}
/**
* Store the contactfieldtype.
*
* @param Request $request
* @return ContactFieldTypeResource|\Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
try {
$contactFieldType = ContactFieldType::create(
$request->except(['account_id'])
+ ['account_id' => auth()->user()->account_id]
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new ContactFieldTypeResource($contactFieldType);
}
/**
* Update the contact field type.
*
* @param Request $request
* @param int $contactFieldTypeId
* @return ContactFieldTypeResource|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $contactFieldTypeId)
{
try {
$contactFieldType = ContactFieldType::where('account_id', auth()->user()->account_id)
->where('id', $contactFieldTypeId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$isvalid = $this->validateUpdate($request);
if ($isvalid !== true) {
return $isvalid;
}
// Update the contactfieldtype itself
try {
$contactFieldType->update(
$request->only([
'name',
'fontawesome_icon',
'protocol',
'delible',
'type',
])
);
} catch (QueryException $e) {
return $this->respondNotTheRightParameters();
}
return new ContactFieldTypeResource($contactFieldType);
}
/**
* Validate the request for update.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse|true
*/
private function validateUpdate(Request $request)
{
// Validates basic fields to create the entry
$validator = Validator::make($request->all(), [
'name' => 'required|max:255',
'fontawesome_icon' => 'nullable|max:255',
'protocol' => 'nullable|max:255',
'delible' => 'integer',
'type' => 'nullable|max:255',
]);
if ($validator->fails()) {
return $this->respondValidatorFailed($validator);
}
return true;
}
/**
* Delete an contactfieldtype.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request, $contactFieldTypeId)
{
try {
$contactFieldType = ContactFieldType::where('account_id', auth()->user()->account_id)
->where('id', $contactFieldTypeId)
->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
$contactFields = auth()->user()->account->contactFields
->where('contact_field_type_id', $contactFieldTypeId);
foreach ($contactFields as $contactField) {
$contactField->delete();
}
$contactFieldType->delete();
return $this->respondObjectDeleted($contactFieldType->id);
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\Api\Settings;
use Illuminate\Http\Request;
use App\Models\Settings\Currency;
use App\Http\Controllers\Api\ApiController;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Resources\Settings\Currency\Currency as CurrencyResource;
class ApiCurrencyController extends ApiController
{
/**
* Get the list of currencies.
*
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index(Request $request)
{
$currencies = Currency::paginate($this->getLimitPerPage());
return CurrencyResource::collection($currencies);
}
/**
* Get the detail of a given currency.
*
* @param Request $request
* @return CurrencyResource|\Illuminate\Http\JsonResponse
*/
public function show(Request $request, $currencyId)
{
try {
$currency = Currency::findOrFail($currencyId);
} catch (ModelNotFoundException $e) {
return $this->respondNotFound();
}
return new CurrencyResource($currency);
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\Api\Statistics;
use App\Helpers\DateHelper;
use Illuminate\Http\Request;
use App\Models\Instance\Instance;
use App\Models\Instance\Statistic;
use App\Http\Controllers\Api\ApiController;
class ApiStatisticsController extends ApiController
{
/**
* Get the list of general, public statistics.
*
* @return \Illuminate\Support\Collection|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
if (config('monica.allow_statistics_through_public_api_access') == false) {
return $this->respondNotFound();
}
// Collecting statistics
$statistic = Statistic::orderBy('created_at', 'desc')->first();
$instance = Instance::first();
// Get the date of the monday of last week
$dateMondayLastWeek = now()->subDays(7);
$dateMondayLastWeek = $dateMondayLastWeek->startOfWeek();
// Get the date of the sunday of last week
$dateSundayLastWeek = now()->subDays(7);
$dateSundayLastWeek = $dateSundayLastWeek->endOfWeek();
// Get the number of users last monday
$instanceLastMonday = Statistic::whereDate('created_at', '=', $dateMondayLastWeek->toDateString())->first();
$instanceLastSunday = Statistic::whereDate('created_at', '=', $dateSundayLastWeek->toDateString())->first();
$numberNewUsers = 0;
if ($instanceLastMonday && $instanceLastSunday) {
$numberNewUsers = $instanceLastSunday->number_of_users - $instanceLastMonday->number_of_users;
}
$statistics = collect();
$statistics->push([
'instance_creation_date' => DateHelper::getTimestamp($instance->created_at),
'number_of_contacts' => ($statistic ? $statistic->number_of_contacts : 0),
'number_of_users' => ($statistic ? $statistic->number_of_users : 0),
'number_of_activities' => ($statistic ? $statistic->number_of_activities : 0),
'number_of_reminders' => ($statistic ? $statistic->number_of_reminders : 0),
'number_of_new_users_last_week' => $numberNewUsers,
]);
return $statistics;
}
}