• File: AdminController.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/Api/AdminController.php
  • Date Modified: 12/18/2025 12:13 AM
  • File size: 15.15 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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);
    }
}