autorizaSesion method

Future<Map<String, dynamic>> autorizaSesion({
  1. required String clientId,
  2. required String clientSecret,
})

Este evento es utilizado para autorizar la sesion del usuario este evento se ejecuta cuando se realiza un login o cuando el status de la peticion al servidor devuelve un sataus == 400 y inStatus == 101 parametros

  • clientId - es el clientId que se obtiene del servidor
  • clientSecret - es el clientSecret que se obtiene del servidor Pata Tener en cuenta este evento es utilizado caundo se trabaja con el login SDK por lo tanto se pasa como valor en redirectoUri el valor socket respuesta - solamente emite un Mapa con el Key dataOk cuando el status de que devuelve el server es 200 y la funcion obtieneToken utilizando el codigoAutorizacion da un resultado OK de lo contrario devuelve un mapa con el Key dataNOk ahora si el status es 302 tambien devuelve un mapa con el Key dataNOk pero con el key redirectUri y en su valor la url de redireccionamiento para realizar el login

Implementation

Future<Map<String, dynamic>> autorizaSesion({
  required String clientId,
  required String clientSecret,
}) async {
  return FlutterUtilsProvider.ejecutaPeticion(() async {
    // Inicializamos el provider con la cascada para asignar valores
    final dataShpProvider = DataShpProvider();

    logDebug('CloudApi.autorizaSesion: Inicio debugMode');

    // Construimos el body para la petición
    final body = {
      EnvironmentApiRest.clientId: clientId,
      EnvironmentApiRest.clientSecret: clientSecret,
      EnvironmentApiRest.redirectUri: RedirectUri.socket.name,
      EnvironmentApiRest.idSesion: dataShpProvider.idSesion,
      EnvironmentApiRest.keyLogin: dataShpProvider.keyLogin,
    };

    logDebug(
      'CloudApi.autorizaSesion: endPoint: '
      '${cloudDb.endpointAuth}${EnvironmentApiRest.rutaAutorizaSesion}, '
      'body: $body',
    );

    // Ejecutamos la petición HTTP
    final flutterHttpProvider =
        FlutterHttpProvider(enableDebugLogs: enableDebugLogs);
    final response = await flutterHttpProvider.httpAccion(
      'POST',
      '${cloudDb.endpointAuth}${EnvironmentApiRest.rutaAutorizaSesion}',
      false,
      '',
      '',
      body: body,
    );
    logDebug('CloudApi.autorizaSesion: response: $response');

    // Manejo del estado cuando no hay conexión (offline)
    if (response[EnvironmentApiRest.status] ==
        EnvironmentApiRest.sinInternet) {
      // Si hay una sesión almacenada localmente, permitimos trabajar offline
      if (dataShpProvider.idSesion.isNotEmpty) {
        return {
          EnvironmentApiRest.dataOk: 'Sesion iniciada Offline',
          EnvironmentApiRest.cambioUsuario: false,
          EnvironmentApiRest.idColeccionAuth: dataShpProvider.idColeccionAuth,
        };
      }
    }

    // Si el response contiene dataNOk, significa que hubo un error en backend
    if (response.containsKey(EnvironmentApiRest.dataNOk)) {
      throw response[EnvironmentApiRest.error];
    }

    // Revisamos el status devuelto
    final status = response[EnvironmentApiRest.status];

    // Caso: 200 - Sesión autorizada en el servidor
    if (status == '200') {
      final respuesta = List.from(response[EnvironmentApiRest.data] ?? []);
      if (respuesta.isEmpty) {
        throw 'No se obtuvo respuesta del servidor';
      }

      final firstItem = respuesta.first as Map<String, dynamic>;
      final codigoAutorizacion =
          firstItem[EnvironmentApiRest.codigoAutorizacion] ?? '';

      // Obtenemos el token usando el código de autorización
      final respuestaObtieneToken = await cloudDb.obtieneToken(
        codigoAutorizacion: codigoAutorizacion,
      );

      if (respuestaObtieneToken.containsKey(EnvironmentApiRest.dataNOk)) {
        throw respuestaObtieneToken[EnvironmentApiRest.error];
      }

      await dataShpProvider
          .setIdSesion(firstItem[EnvironmentApiRest.idSesion] ?? '');
      // dataShpProvider.idSesion = firstItem[EnvironmentApiRest.idSesion] ?? '';
      final idColeccionAuth = firstItem[EnvironmentApiRest.idColeccion] ?? '';

      return {
        EnvironmentApiRest.dataOk: 'Sesion Autorizada Correctamente',
        EnvironmentApiRest.cambioUsuario:
            dataShpProvider.idColeccionAuth != idColeccionAuth,
        EnvironmentApiRest.idColeccionAuth: idColeccionAuth,
      };
    }

    // Caso: 302 - Redirección requerida
    if (status == '302') {
      dataShpProvider
          .setIdSesion(response[EnvironmentApiRest.idSesion] ?? '');
      // dataShpProvider.idSesion = response[EnvironmentApiRest.idSesion] ?? '';

      logDebug(
        'CloudApi.autorizaSesion: redirectUri(location): '
        '${response[EnvironmentApiRest.location]}',
      );

      return {
        EnvironmentApiRest.dataNOk: 'NOK',
        EnvironmentApiRest.redirectUri:
            response[EnvironmentApiRest.location] ?? '',
        EnvironmentApiRest.socketChannel:
            response[EnvironmentApiRest.socketChannel] ?? '',
      };
    }

    // Si no es ninguno de los anteriores, se retorna la respuesta tal cual
    return response;
  });
}