5 Commits

11 changed files with 133 additions and 42 deletions

View File

@@ -12,7 +12,7 @@ post {
body:json {
{
"iccid": "1234"
"iccid": "8934909001500561503"
}
}

View File

@@ -11,7 +11,7 @@ post {
}
body:form-urlencoded {
iccid: 8935103196306448300
iccid: 8934909001500561503
~offer: SAVEFAMILY1
}

View File

@@ -72,9 +72,28 @@ export class SimAlaiController {
const data = this.validateMsg(msg) as SimEvents.activation
const iccid = data.payload.iccid
const correlation_id = data.headers?.message_id
const externalId = data.payload.orderId
const res = await this.tryUseCase(msg, this.uscases.activate({
iccid: iccid,
correlation_id: correlation_id
correlation_id: correlation_id,
}))
return res;
}
}
public preactivate() {
return async (msg: ConsumeMessage) => {
console.log("[i] Evento activate ", msg.fields)
const data = this.validateMsg(msg) as SimEvents.activation
const iccid = data.payload.iccid
const correlation_id = data.headers?.message_id
const externalId = data.payload.orderId
const res = await this.tryUseCase(msg, this.uscases.preactivate({
iccid: iccid,
correlation_id: correlation_id,
externalId: externalId
}))
return res;
}

View File

@@ -24,7 +24,7 @@ export class SimAlaiRouter {
["pause", this.simController.suspend()],
["reactivate", this.simController.reActivate()],
["cancel", this.simController.terminate()],
["preActivate", this.simController.activate()]
["preActivate", this.simController.preactivate()]
]);
}

View File

@@ -11,6 +11,7 @@
import { AlaiAPI } from "#domain/AlaiAPI.js";
import { AlaiRepository } from "#infrastructure/AlaiRepository.js";
import { ConsumeMessage } from "amqplib";
import { error } from "node:console";
import { ErrorOrderDTO, FinishOrderDTO, UpdateOrderDTO } from "sim-shared/domain/Order.js";
import { Result } from "sim-shared/domain/Result.js";
import { HttpClient } from "sim-shared/infrastructure/HTTPClient.js";
@@ -108,17 +109,31 @@ export class SimAlaiUsecases {
public activate(args: {
iccid: string,
correlation_id: string | undefined
correlation_id: string | undefined,
}) {
return this.usecaseTemplate(async (iccid /*iccid*/) => {
const order = await this.alaiRepository.createOrder()
if (order.error != undefined) {
// Falla el crearse un order (problema de servidor, token, etc)
console.error(order.error)
return order
const sim = await this.alaiRepository.getSimByICCID(iccid)
if (sim.error != undefined) {
return sim
}
const reserved = await this.alaiRepository.createReserve(order.data.id, iccid)
return reserved
if (sim.data == undefined) {
return {
error: `La sim ${iccid} no se ha encontrado`
}
}
const subscriptionId = sim.data.subscription!.id
if (subscriptionId == undefined) {
return {
error: `La sim ${iccid} no tiene un id de subscripción`
}
}
const activationRes = await this.alaiRepository.activateSubscription(subscriptionId)
return activationRes
}, args.iccid, args.correlation_id)
}
@@ -155,7 +170,7 @@ export class SimAlaiUsecases {
}
// TODO: Controlar sim no encotrada (No deberia pasar)
const subscriptionId = preactivatedSim.data!.subscription.id
const subscriptionId = preactivatedSim.data!.subscription!.id
if (args.externalId) {
const externalIdAdded = await this.alaiRepository.changeExternalId(subscriptionId, args.externalId)
if (externalIdAdded.error != undefined) {
@@ -180,7 +195,8 @@ export class SimAlaiUsecases {
}
// TODO: Controlar que no se encuentre la subscription
const suspension = this.alaiRepository.pauseSubscription(subscription.data!.id)
const subscriptionid = subscription.data?.subscription?.id
const suspension = this.alaiRepository.pauseSubscription(subscriptionid!)
return suspension
}, args, args.correlation_id)
}
@@ -195,9 +211,9 @@ export class SimAlaiUsecases {
if (subscription.error != undefined) {
return subscription
}
const subscriptionid = subscription.data?.subscription?.id
// TODO: Controlar que no se encuentre la subscription
const suspension = this.alaiRepository.unPauseSubscription(subscription.data!.id)
const suspension = this.alaiRepository.unPauseSubscription(subscriptionid!)
return suspension
}, args, args.correlation_id)
}
@@ -230,8 +246,8 @@ export class SimAlaiUsecases {
*/
public async selectCompleteSim(iccid: string): Promise<Result<string, {
sim: AlaiAPI.Sim,
subscription: AlaiAPI.Subscription,
imei: AlaiAPI.GetImeiSubscriptionDTO
subscription?: AlaiAPI.Subscription,
imei?: AlaiAPI.GetImeiSubscriptionDTO
}>> {
const sim = await this.alaiRepository.getSimByICCID(iccid)
@@ -239,7 +255,24 @@ export class SimAlaiUsecases {
return sim
}
const subscriptionId = sim.data!.subscription.id
if (sim.data == undefined) {
return {
error: `La sim ${iccid} no se ha encontrado`
}
}
// En este caso la tarjeta no se ha preactivado, por lo que no tiene subscripcion
if (sim.data.subscription == undefined) {
return {
data: {
sim: sim.data,
subscription: undefined,
imei: undefined
}
}
}
const subscriptionId = sim.data.subscription.id
const subscription = await this.alaiRepository.getSubscriptionById(subscriptionId)
if (subscription.error != undefined) {

View File

@@ -1 +1 @@
eyJhbGciOiJIUzM4NCJ9.eyJiciI6InNhdmVmYW1pbHkiLCJpcCI6Ijg4LjE1LjE1Ny4xNjciLCJzdWIiOiJwYWxvbWFpYmFuZXoiLCJzIjoiRVdTMTY0NmFmNjNlZGUyMjgzIiwicG9zIjoic2F2ZWZhbWlseUNhYyIsImlkV3NVc2VyIjoiODYiLCJpc012bmEiOmZhbHNlLCJkb21haW4iOiJBbGFpfHNhdmVmYW1pbHkiLCJpYXQiOjE3Nzc4OTk3MzcsImV4cCI6MTc3NzkxMDUzN30.PvTTRhUpKlslGOerQsLY4RLBXdQ5FIVvUKb_1ZK4b2Zggt04KZhwX0d-XoLAcP93
eyJhbGciOiJIUzM4NCJ9.eyJiciI6InNhdmVmYW1pbHkiLCJpcCI6Ijg4LjE1LjE1Ny4xNjciLCJzdWIiOiJwYWxvbWFpYmFuZXoiLCJzIjoiRVdTMTY3Mjc3OTE3YmVlMmU3IiwicG9zIjoic2F2ZWZhbWlseUNhYyIsImlkV3NVc2VyIjoiODYiLCJpc012bmEiOmZhbHNlLCJkb21haW4iOiJBbGFpfHNhdmVmYW1pbHkiLCJpYXQiOjE3Nzg2Njk5NTgsImV4cCI6MTc3ODY4MDc1N30.N_PZ3X2sMsMIs1gomG7eyCKyC8hev5EOeXIOZvQZelKwTkVX-U7P0Gbu6nhNeLyp

View File

@@ -5,13 +5,16 @@ import { httpsAgent } from "./httpsAgent.js"
import { DebugTokenManager } from "#aplication/DebugTokenManager.js";
const tokenManager = new AlaiTokenManager()
//const debugTokenManagr = new DebugTokenManager()
const debugTokenManagr = new DebugTokenManager()
//console.error("USANDO DebugTokenManager! Eliminar en prod")
export const alaiHttp = new HttpClient({
baseURL: env.ALAI_API_URL as string,
headers: {},
jwtManager: tokenManager,
headers: {
"content-type": "application/json"
},
//jwtManager: tokenManager,
jwtManager: debugTokenManagr,
httpsAgent: httpsAgent
})

View File

@@ -237,7 +237,7 @@ export namespace AlaiAPI {
name: string,
links: Link[]
},
subscription: {
subscription?: {
id: string,
name: string,
links: Link[]

View File

@@ -11,7 +11,8 @@ const alaiStates = new Map<AlaiAPI.Status, CommonSim<any>["billing_status"]>([
["CONFIGURING", "SUSPENDED"],
["DELETED", "TERMINATED"],
["PRE_ACTIVE", "PREACTIVATED"],
["TERMINATED", "TERMINATED"]
["TERMINATED", "TERMINATED"],
])
const alaiNetworkStates = new Map<AlaiAPI.NetworkStatus, CommonSim<any>["network_status"]>([
@@ -22,23 +23,37 @@ const alaiNetworkStates = new Map<AlaiAPI.NetworkStatus, CommonSim<any>["network
["FRAUD", "TERMINATED"]
])
export function alaiSimToCommonSim(alaiSim: AlaiAPI.Sim, alaiSubscription: AlaiAPI.Subscription, imeiSubscription: AlaiAPI.GetImeiSubscriptionDTO):
Result<string, CommonSim<AlaiAPI.Subscription>> {
export function alaiSimToCommonSim(alaiSim: AlaiAPI.Sim, alaiSubscription?: AlaiAPI.Subscription, imeiSubscription?: AlaiAPI.GetImeiSubscriptionDTO):
Result<string, CommonSim<
{
sim: AlaiAPI.Sim,
subscription?: AlaiAPI.Subscription,
imeiSubscription?: AlaiAPI.GetImeiSubscriptionDTO
}
>> {
const status = alaiStates.get(alaiSubscription.status) ?? "UNKNOWN"
const networkStatus = alaiNetworkStates.get(alaiSubscription.networkStatus) ?? "UNKNOWN"
const billingStatus = (alaiSubscription == undefined) ? "AVAILABLE" : alaiStates.get(alaiSubscription?.status ?? "") ?? "UNKNOWN"
const networkStatus = (alaiSubscription == undefined) ? "AVAILABLE" : alaiNetworkStates.get(alaiSubscription.networkStatus) ?? "UNKNOWN"
const commonSim: CommonSim<AlaiAPI.Subscription> = {
const commonSim: CommonSim<{
sim: AlaiAPI.Sim,
subscription?: AlaiAPI.Subscription,
imeiSubscription?: AlaiAPI.GetImeiSubscriptionDTO
}> = {
company: "ALAI",
tariff: alaiSubscription.name,
tariff: alaiSubscription?.name,
iccid: alaiSim.id,
msisdn: alaiSubscription.lastMsisdnID,
billing_status: status,
msisdn: alaiSubscription?.lastMsisdnID,
billing_status: billingStatus,
network_status: networkStatus,
raw: alaiSubscription,
imei: imeiSubscription.content[0].id ?? "0",
preactivation_date: new Date(alaiSubscription.creationDate),
activation_date: new Date(alaiSubscription.firstActivationDate)
raw: {
subscription: alaiSubscription,
sim: alaiSim,
imeiSubscription: imeiSubscription
},
imei: imeiSubscription?.content[0]?.id ?? "0",
preactivation_date: (alaiSubscription != undefined) ? new Date(alaiSubscription.creationDate) : undefined,
activation_date: (alaiSubscription != undefined) ? new Date(alaiSubscription.firstActivationDate) : undefined
}
return {

View File

@@ -135,16 +135,37 @@ export class AlaiRepository {
return res
}
public async unPauseSubscription(subscriptionId: string) {
public async activateSubscription(subscriptionId: string) {
const endpoint = `/v1/subscription/${subscriptionId}`
// En teoria ahora se usa ["action", "UNBLOCK"] pero no he probado
const params = new URLSearchParams([
["action", "CHANGE_STATUS"]
])
const data = {
"status": "ACTIVE"
}
const promReq = this.httpClient.patch<AlaiAPI.UpdateSubscriptionDTO | undefined>(endpoint, data, { params: params })
const res = await this.manageRequest(promReq)
return res
}
public async unPauseSubscription(subscriptionId: string) {
const endpoint = `/v1/subscription/${subscriptionId}`
// En teoria ahora se usa ["action", "UNBLOCK"] pero no he probado
const params = new URLSearchParams([
["action", "UNBLOCK"]
])
const rawParams = {
"action": "UNBLOCK"
}
const data = {
status: "ACTIVE"
}
const promReq = this.httpClient.patch<AlaiAPI.UpdateSubscriptionDTO | undefined>(endpoint, data, { params: params })
const promReq = this.httpClient.patch<AlaiAPI.UpdateSubscriptionDTO | undefined>(endpoint, undefined, { params: rawParams })
const res = await this.manageRequest(promReq)
return res
}

View File

@@ -1,9 +1,9 @@
export type CommonSim<T> = {
company: "NOS" | "OBJ" | "ALAI",
iccid: string,
msisdn: string,
tariff: string, // Depende de la compañia
billing_status: "PREACTIVATED" | "ACTIVE" | "SUSPENDED" | "TERMINATED" | "UNKNOWN",
msisdn?: string,
tariff?: string, // Depende de la compañia
billing_status: "AVAILABLE" | "PREACTIVATED" | "ACTIVE" | "SUSPENDED" | "TERMINATED" | "UNKNOWN",
network_status: "AVAILABLE" | "PREACTIVATED" | "ACTIVE" | "SUSPENDED" | "TERMINATED" | "UNKNOWN",
preactivation_date?: Date | null,
activation_date?: Date | null,