<?php
namespace App\Http\Controllers\Api;
use App\Admin;
use App\Classes\CurrentPassword;
use App\Classes\GenerateUserId;
use App\Classes\ImageUploader;
use App\Http\Controllers\Controller;
use App\IaData;
use App\PaymentService;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Route;
use Laravel\Passport\Client;
class AdminController extends Controller
{
private $client;
public function __construct()
{
$this->client = Client::find(4);
}
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required'
], [
'email.required' => 'O Campo Email é Obrigatório',
'password.required' => 'O Campo Senha é Obrigatório',
]);
$params = [
'grant_type' => 'password',
'client_id' => $this->client->id,
'client_secret' => $this->client->secret,
'username' => request('email'),
'password' => request('password'),
'provider' => 'admins',
'scope' => '*'
];
$request->request->add($params);
Config::set('auth.guards.api.provider', $params['provider']);
$proxy = Request::create('oauth/token', 'POST');
return Route::dispatch($proxy);
}
public function refresh(Request $request)
{
$this->validate($request, [
'refresh_token' => 'required'
]);
$params = [
'grant_type' => 'refresh_token',
'refresh_token' => request('refresh_token'),
'client_id' => $this->client->id,
'client_secret' => $this->client->secret,
'username' => request('email'),
'password' => request('password'),
'provider' => 'admins'
];
$request->request->add($params);
Config::set('auth.guards.api.provider', $params['provider']);
$proxy = Request::create('oauth/token', 'POST');
return Route::dispatch($proxy);
}
public function logout(Request $request)
{
$accessToken = Auth::user()->token();
DB::table('oauth_refresh_tokens')->where('access_token_id', $accessToken->id)
->update(['revoked' => true]);
$accessToken->revoke();
return response()->json([], 204);
}
public function saveUser(Request $request)
{
$generate = new GenerateUserId();
$randomString = $generate->generatedUserId(30);
$user = Admin::create([
'name' => request('name'),
'last_name' => request('last_name'),
'email' => request('email'),
'profile' => request('profile'),
'phone' => request('phone'),
'status' => 1,
'bi' => request('bi'),
'user_id' => $randomString,
'password' => bcrypt('12345678'),
]);
return response()->json(['message' => 'Utilizador Adicionado com Sucesso'], 200);
}
public function loggedUser(Request $request)
{
return response()->json($request->user());
}
public function getUsers()
{
$users = Admin::query()->get();
return response()->json(['data' => $users]);
}
public function deleteUser($id)
{
$user = Admin::query()->where('id', $id)->first();
if ($user) {
$user->delete();
return response()->json(['message' => 'Utilizador removido com Sucesso']);
} else {
return response()->json(['message' => 'Utilizador não encontrado'], 404);
}
}
public function updateUser(Request $request)
{
// return $request->all();
$user = Admin::query()->where('id', $request->id)->first();
if ($user) {
$user->update([
'name' => request('name'),
'last_name' => $request->last_name,
'email' => request('email'),
'phone' => request('phone'),
'profile' => $request->profile,
'bi' => request('bi'),
'password' => bcrypt(request('password')),
]);
return response()->json(['message' => 'Dados do ' . $user->name . ' actualizados com Sucesso']);
} else {
return response()->json(['message' => 'Utilizador não encontrado'], 404);
}
}
public function getUser($id)
{
$user = Admin::query()->where('id', $id)->first();
return response()->json($user);
}
public function enableOrDisable($id)
{
$user = Admin::query()->where('id', $id)->first();
if ($user->status == 1) {
$user->update([
'status' => 0
]);
return response()->json(['message' => 'Utilizador ' . $user->name . ' desabilitado com Sucesso!']);
} else {
$user->update([
'status' => 1
]);
return response()->json(['message' => 'Utilizador ' . $user->name . ' activado com Sucesso!']);
}
}
public function updateUserPasword(Request $request)
{
$user = Admin::query()->where('id', $request->id)->first();
if ($user) {
if (Hash::check($request->current_password, $user->password) && $request->current_password != null) {
$user->update([
'password' => bcrypt($request->new_password)
]);
return response()->json(['message' => 'Senha da conta ' . $user->email . ' actualizada com Sucesso'], 200);
} else {
return response()->json(['message' => 'Senha Antiga Inválida'], 400);
}
} else {
return response()->json(['message' => 'Utilizador inválido'], 400);
}
}
public function changePassword(Request $request)
{
$this->validate(
$request,
[
'current_password' => ['required', new CurrentPassword()],
'new_password' => ['required', 'min:8', 'confirmed'],
'new_password_confirmation' => 'required|min:8',
],
[
'current_password.required' => 'O Campo Senha Actual é Obrigatório',
'new_password.required' => 'O Campo Nova Senha é Obrigatório',
'new_password_confirmation.required' => 'O Campo Confirmar Senha é Obrigatório',
'new_password.confirmed' => 'Senhas incompatíveis',
'current_password.min' => 'A senha deve ter 8 digitos no mínimo',
'new_password.min' => 'A senha deve ter 8 digitos no mínimo',
'new_password_confirmation.min' => 'A senha deve ter 8 digitos no mínimo'
]
);
if (Hash::check($request->current_password, $request->user()->password)) {
$request->user()->update([
'password' => bcrypt($request->new_password),
'session_status' => 1
]);
return response()->json(['message' => 'Senhas Compativeis'], 200);
} else {
return response()->json(['message' => 'Senha Antiga Inválida'], 404);
}
}
// PaymentServices
public function createPaymentServices(Request $request)
{
$this->validate(
$request,
[
'name' => 'required',
'logo' => 'required|file|mimes:jpeg,jpg,png|max:4096',
'billing_rate' => 'required',
'acronym' => 'required',
'unit_tax' => 'required|in:PERCENTAGE,UNIT',
],
[
'name.required' => 'Campo name é obrigatorio',
'logo.required' => 'Campo logo é obrigatorio',
'logo.file' => 'Campo logo é um ficheiro',
'logo.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png',
'billing_rate.required' => 'Campo billing_rate e obrigatorio',
'acronym.required' => 'Campo acronym é obrigatorio',
'unit_tax.required' => 'Campo unit_tax é obrigatorio',
'unit_tax.in' => 'O tipo de taxa unitaria deve ser um tipo valido: PERCENTAGE, UNIT',
]
);
$image_uploader = new ImageUploader('documents');
$payment_services = new PaymentService;
$payment_services->name = $request->name;
$payment_services->logo = $image_uploader->generateImageUrl($request, 'logo');
$payment_services->billing_rate = $request->billing_rate;
$payment_services->acronym = $request->acronym;
$payment_services->unit_tax = $request->unit_tax;
if ($payment_services) {
try {
$payment_services->save();
return response()->json(['message' => 'Criado com sucesso!'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Erro ao salvar'], 500);
}
} else {
return response()->json(['message' => 'Nao pode registar os dados informados ja estao em uso'], 400);
}
}
public function getPaymentServices()
{
$payments_services = PaymentService::query()
->select('payment_services.*')
->where('payment_services.status', '=', 1)
->orderBy('payment_services.id', 'DESC')
->get();
if ($payments_services->isEmpty()) {
// return response()->json(['message' => 'Sem dados.'], 200);
return response()->json(['data' => []], 200);
}
return response()->json(['data' => $payments_services], 200);
}
public function getAllPaymentServices()
{
$payments_services = PaymentService::query()
->select('payment_services.*')
// ->where('payment_services.status', '=', 1)
->orderBy('payment_services.id', 'DESC')
->get();
if ($payments_services->isEmpty()) {
// return response()->json(['message' => 'Sem dados.'], 200);
return response()->json(['data' => []], 200);
}
return response()->json(['data' => $payments_services], 200);
}
public function createIAData(Request $request)
{
// $this->validate(
// $request,
// [
// 'title' => 'required',
// 'img_link' => 'file|mimes:jpeg,jpg,png|max:4096',
// 'info' => 'required',
// ],
// [
// 'title.required' => 'Campo title é obrigatorio',
// 'img_link.file' => 'Campo img_link é um ficheiro',
// 'img_link.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png',
// 'info.required' => 'Campo info e obrigatorio',
// ]
// );
$image_uploader = new ImageUploader('documents');
$ai_data = new IaData();
$ai_data->title = $request->title;
if ($request->hasFile('img_link')) {
$ai_data->img_link = $image_uploader->generateImageUrl($request, 'img_link');
} else {
$ai_data->img_link = null;
}
$ai_data->info = $request->info;
if ($ai_data) {
try {
$ai_data->save();
return response()->json(['message' => 'Registado com sucesso!'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Erro ao salvar'], 500);
}
} else {
return response()->json(['message' => 'Nao pode registar os dados informados ja estao em uso'], 400);
}
}
public function getAllIAData()
{
$ai_data = IaData::query()->orderBy('id', 'asc')->get();
if ($ai_data->isEmpty()) {
// return response()->json(['message' => 'Sem dados.'], 200);
return response()->json(['data' => []], 200);
}
return response()->json(['data' => $ai_data], 200);
}
// public function users_transac_error(Request $request)
// {
// $user = User::with('imaliBusinessAccount')
// ->where('users.id', $request->users_data)
// ->orWhere('users.email', $request->users_data)
// // ->orWhere('users.name', $request->users_data)
// ->orWhere('users.phone', $request->users_data)
// ->first();
// return response()->json(['data' => ['users-data' => $user]], 200);
// }
public function users_transac_error(Request $request)
{
$user = User::query()
->where('users.id', $request->users_data)
->orWhere('users.email', $request->users_data)
->orWhere('users.phone', $request->users_data)
->with([
'imaliBusinessAccount' => function ($query) {
$query->select(
'id',
'user_id',
'name',
'company_name',
'account_number',
'reference',
'balance',
'imali_account_config'
)
->with([
'withdrawalsRequests' => function ($q) {
$q->latest()
->limit(1);
}
]);
}
])
->select(
'id',
'name',
'phone',
'profile',
'email'
)
->first();
return response()->json([
'data' => [
'user' => $user ? [
'id' => $user->id,
'name' => $user->name,
'phone' => $user->phone,
'profile' => $user->profile,
'email' => $user->email,
'imali_business_account' => $user->imaliBusinessAccount ? [
'name' => $user->imaliBusinessAccount->name,
'company_name' => $user->imaliBusinessAccount->company_name,
'account_number' => $user->imaliBusinessAccount->account_number,
'reference' => $user->imaliBusinessAccount->reference,
'balance' => $user->imaliBusinessAccount->balance,
'user_id' => $user->imaliBusinessAccount->user_id,
'imali_account_config' => $user->imaliBusinessAccount->imali_account_config,
'last_withdrawals' => $user->imaliBusinessAccount->withdrawalsRequests
] : null
] : null
]
], 200);
}
}