@it_kyryl/arbitrage_admin_schema
Version:
Schema for arbitrage admin panel
594 lines (506 loc) • 19.4 kB
text/typescript
import { Account, Agency, BinomUser, BusinessDirection, PrismaClient, RequestStatus, SystemSettings, Team, Timezone, ProviderAccount, TopUpType, TrafficSource, User, Vertical, WorkerEntity, TonicCampaignStatus, OfferStatus } from "@prisma/client";
import bcrypt from 'bcryptjs';
import { getRandomNumber, getRandomValue } from "../utils/math";
import moment from "moment-timezone";
import { TcpNetConnectOpts } from "net";
async function main() {
const client = new PrismaClient();
// await fixTonicCampaigns(client);
// basic entities
// await addSettings(settings, client);
// await addTimezones(timezones, client);
// await addAgencies(agencies, client);
// await addBusinessDirections(businessDirections, client);
// // single/one to one entity
// await addTeams(teams, client);
// await addBinomUsers(binomUsers, client);
// await addUsers(users, client);
// await addTonicAccounts(tonicAccounts, client);
// await addAccounts(accounts, client);
// await addSpend(client);
// await addAccountActivities(client);
// await addAccountRequests(client);
// await addTopUpRequest(client);
// //many to many entity
// await addAccountsToUsers(client);
await client.$disconnect();
}
async function createFinanceProfiles(client: PrismaClient) {
const users = await client.user.findMany({
where: {
financeProfile: {
is: null
}
}
})
for(let user of users) {
await client.financeProfile.create({
data: {
userFinanceProfile: {
create: {
userId: user.id,
userFinanceProfileType: 'FRONT_OFFICE'
}
},
financeProfileEntityType: 'USER',
payoutCurrency: 'USD'
}
})
}
const teams = await client.team.findMany({
where: {
financeProfile: {
is: null
}
}
})
for(let team of teams) {
await client.financeProfile.create({
data: {
teamFinanceProfile: {
create: {
teamId: team.id
}
},
financeProfileEntityType: 'TEAM',
payoutCurrency: 'USD'
}
})
}
}
/*
async function fixTonicCampaigns(client: PrismaClient) {
const offerSelect = {
id: true
};
const dateRevenue = await client.dateRevenue.findMany({
distinct: ['providerEntityId'],
where: {
amount: {
gt: 0
},
providerEntity: {
provider: 'TONIC'
},
offer: {
is: null
}
},
select: {
providerEntity: {
select: {
tonicCampaign: {
select: {
id: true
}
}
}
}
}
})
const dateRevenueIdsTonicCampaignIds = dateRevenue.map( dr => dr.providerEntity?.tonicCampaign?.id).filter( id => Boolean(id)) as number[];
console.log(`Found ${dateRevenueIdsTonicCampaignIds.length} unique tonic campaign ids from date revenue`);
const hashedDateRevenueIdsTonicCampaignIds = dateRevenueIdsTonicCampaignIds.reduce((table, id) => {
table[id] = id;
return table;
}, {} as Record<string,number>)
let tonicCampaigns = await client.tonicCampaign.findMany({
orderBy: {
tonicCreateDate: {
sort: 'desc',
nulls: 'last'
}
},
select: {
offer: {
select: offerSelect
},
providerEntity: {
select: {
providerAccount: {
select: {
trafficSource: true,
id: true
}
},
id: true
},
},
providerAccountId: true,
name: true,
status: true,
id: true
},
where: {
offer: {
is: null
}
},
});
console.log(`Found ${tonicCampaigns.length} tonic campaigns in db.`);
tonicCampaigns = tonicCampaigns.filter( tc => {
return hashedDateRevenueIdsTonicCampaignIds[tc.id] || (tc.status && (['active', 'incomplete', 'pending', 'stopped'] as TonicCampaignStatus[]).includes(tc.status))
})
console.log(`Filtered tonic campaigns. new length is ${tonicCampaigns.length} `);
const owner = await client.user.findFirst({
where: {
role: 'OWNER'
},
select: {
id: true
}
})
if(!owner) throw new Error(`No owner exists, unable to assign offers`);
for(let [index, tonicCampaign] of Object.entries(tonicCampaigns)) {
try {
let offer = tonicCampaign.offer;
if(!offer) {
let providerAccountId = tonicCampaign.providerEntity.providerAccount?.id;
if(!providerAccountId) providerAccountId = tonicCampaign.providerAccountId ?? undefined;
if(!providerAccountId) throw new Error(`Tonic campaign ${tonicCampaign.id} does not have connected provider account through provider entity`);
let offerStatus: OfferStatus;
let errorMessage: string | undefined = undefined;
switch (tonicCampaign.status) {
case 'active':
offerStatus = 'ACTIVE';
break;
case 'pending':
offerStatus = 'PENDING'
default:
offerStatus = 'ERROR';
errorMessage = `Tonic campaign status is ${tonicCampaign.status}`;
break;
}
offer = await client.offer.create({
data: {
provider: 'TONIC',
tf: tonicCampaign.providerEntity.providerAccount?.trafficSource ?? 'FACEBOOK',
tracker: 'BINOM_V2',
type: 'RSOC',
userId: owner.id,
name: tonicCampaign.name ?? '',
status: offerStatus,
providerAccountId: providerAccountId,
errorDescription: errorMessage,
tonicCampaign: {
connect: {
id: tonicCampaign.id
}
},
},
select: {
...offerSelect
}
})
console.log(`${+index + 1}/${tonicCampaigns.length}Offer ${offer.id} added for tonic campaign ${tonicCampaign.id}.`);
}
const updatedDateRevenue = await client.dateRevenue.updateManyAndReturn({
where: {
providerEntityId: tonicCampaign.providerEntity.id
},
data: {
offerId: offer.id
},
select: {
id: true
}
})
console.log(`Updated ${updatedDateRevenue.length} date revenues.`);
} catch (e: any) {
console.log(e.message);
}
}
}
*/
// async function addTopUpRequest(client: PrismaClient) {
// const allAccounts = await client.account.findMany({include: {
// topUps: true
// }});
// const allUsers = await client.user.findMany();
// const allPlatforms = Object.values(TrafficSource);
// const requestStatuses = Object.values(RequestStatus);
// const allTopUpTypes = Object.values(TopUpType);
// }
// for(let user of users) {
// await userFinanceProfile({
// userId: user.id,
// financeProfile: user.userFinanceProfile && {
// id: user.userFinanceProfile.id
// },
// financeProfiles: user.financeProfiles
// })
// }
// }
// async function userFinanceProfile({
// userId,
// financeProfile,
// financeProfiles
// }: {
// userId: number,
// financeProfiles: {
// id: number
// }[],
// financeProfile: {
// id: number
// } | null
// }) {
// if(!financeProfile) {
// if(financeProfiles.length > 0) { // if exists
// await client.user.update({
// data: {
// userFinanceProfileId: financeProfiles[0].id
// },
// where: {
// id: userId
// }
// })
// } else {
// await client.user.update({
// data: {
// userFinanceProfile: {
// create: {
// name: '',
// userId: userId,
// monthlyBaseSalary: 0,
// financeProfileType: 'FRONT_OFFICE'
// }
// }
// },
// where: {
// id: userId
// }
// })
// }
// }
// }
// async function addTopUpRequest(client: PrismaClient) {
// const allAccounts = await client.account.findMany({include: {
// topUps: true
// }});
// const allUsers = await client.user.findMany();
// const allPlatforms = Object.values(TrafficSource);
// const requestStatuses = Object.values(RequestStatus);
// const allTopUpTypes = Object.values(TopUpType);
// }
// async function addAccountRequests(client: PrismaClient) {
// }
// async function addAccountActivities(client: PrismaClient) {
// const allAccounts = await client.account.findMany();
// for(const account of allAccounts) {
// await client.accountActivity.create({
// data: {
// type: 'BANNED',
// eventTime: moment().subtract(getRandomNumber(0, 10), 'days').toDate(),
// accountId: account.id
// }
// })
// await client.accountActivity.create({
// data: {
// type: 'UNBANNED',
// eventTime: moment().subtract(getRandomNumber(0, 10), 'days').toDate(),
// accountId: account.id
// }
// })
// const topUpOldValue = getRandomNumber(100, 1000);
// const topValue = getRandomNumber(100, 1000);
// await client.accountActivity.create({
// data: {
// type: 'TOPUP',
// eventTime: moment().subtract(getRandomNumber(0, 10), 'days').toDate(),
// accountId: account.id,
// actor: 'Random actor',
// value: topValue,
// newValue: topUpOldValue + topValue,
// oldValue: topUpOldValue,
// }
// })
// const withdrawalOldValue = getRandomNumber(1000, 2000);
// const withdrawalValue = getRandomNumber(100, 1000);
// await client.accountActivity.create({
// data: {
// type: 'WITHDRAWAL',
// eventTime: moment().subtract(getRandomNumber(0, 10), 'days').toDate(),
// accountId: account.id,
// actor: 'Random actor',
// value: withdrawalValue,
// newValue: withdrawalOldValue - withdrawalValue,
// oldValue: withdrawalOldValue,
// }
// })
// }
// }
// async function addSpend(client: PrismaClient) {
// const allAccounts = await client.account.findMany();
// await client.adStat.deleteMany();
// for(let i = 0; i < 1000; i++) {
// const randomAccount = getRandomValue(allAccounts);
// await client.adStat.create({
// data: {
// accountId: randomAccount.accountId,
// adgroupId: randomAccount.accountId,
// adId: randomAccount.accountId + i.toString(),
// campaignId: randomAccount.accountId,
// clicks: getRandomNumber(100, 1000),
// conversions: getRandomNumber(1, 100),
// date: moment().subtract(getRandomNumber(0, 10), 'days').toDate(),
// impressions: getRandomNumber(1000, 10000),
// spend: getRandomNumber(0, 100),
// accountIdRef: randomAccount.id
// }
// })
// }
// }
// async function addBinomUsers(data: BinomUser[], client: PrismaClient) {
// const existedBU = await client.binomUser.findMany();
// for(const bu of data) {
// const existedBu = existedBU.find(existedBd => existedBd.name === bu.name);
// if(existedBu) continue;
// await client.binomUser.create({
// data: bu
// })
// }
// }
// async function addTeams(data: Team[], client: PrismaClient) {
// const businessDirections = await client.businessDirection.findMany();
// for(const team of data) {
// const existingTeams = await client.team.findMany();
// const existingTeam = existingTeams.find(existedTeam => existedTeam.name === team.name);
// if(existingTeam) continue;
// const admin = await client.user.findFirst({
// where: {
// role: 'OWNER'
// }
// })
// await client.team.create({
// data: {
// ...team,
// managerId: admin?.id,
// businessDirectionId: getRandomValue(businessDirections)?.id,
// parentTeamId: getRandomValue(existingTeams)?.id
// }
// })
// }
// }
// async function addBusinessDirections(data: BusinessDirection[], client: PrismaClient) {
// const existedBDs = await client.businessDirection.findMany();
// for(const bd of data) {
// const existedBd = existedBDs.find(existedBd => existedBd.name === bd.name);
// if(existedBd) continue;
// await client.businessDirection.create({
// data: bd
// })
// }
// }
// async function addAccountsToUsers(client: PrismaClient) {
// const exitingAccountsToUsers = await client.accountUser.findMany();
// const existingAccounts = await client.account.findMany();
// const existingUsers = await client.user.findMany();
// for(let existingAccount of existingAccounts) {
// for(let existingUser of existingUsers) {
// const connectionExist = exitingAccountsToUsers.find( connection => {
// return connection.accountId === existingAccount.id && connection.userId === existingUser.id
// });
// if(connectionExist) continue;
// await client.accountUser.create({
// data: {
// accountId: existingAccount.id,
// userId: existingUser.id
// }
// })
// }
// }
// }
// async function addAccounts(accounts: Account[], client: PrismaClient) {
// const existedAccounts = await client.account.findMany();
// const allAgencies = await client.agency.findMany();
// for(let account of accounts) {
// const timezoneExist = existedAccounts.find( a => a.accountId === account.accountId);
// if(timezoneExist) continue;
// await client.account.create({
// data: {
// ...account,
// agencyId: getRandomValue(allAgencies).id,
// }
// })
// }
// }
// async function addTimezones(data: Timezone[], client: PrismaClient) {
// const dbTimezones = await client.timezone.findMany();
// for(let timezone of data) {
// const timezoneExist = dbTimezones.find( tz => tz.name === timezone.name);
// if(timezoneExist) continue;
// await client.timezone.create({
// data: timezone,
// })
// }
// }
// async function addAgencies(data: Agency[], client: PrismaClient) {
// const agencies = await client.agency.findMany();
// for(let agencyToAdd of data) {
// const agencyExist = agencies.find( agency => agency.name === agencyToAdd.name);
// if(agencyExist) continue;
// await client.agency.create({
// data: agencyToAdd
// })
// }
// }
// async function addSettings(data: SystemSettings, client: PrismaClient) {
// const settings = await client.systemSettings.findMany();
// if (settings.length > 0) return;
// await client.systemSettings.create({
// data
// })
// }
// async function addUsers(data: User[], client: PrismaClient) {
// const users = await client.user.findMany();
// const existingTeams = await client.team.findMany();
// for(let user of data as Required<User>[]) { // Users
// if(isUserExistInArray(user, users)) continue;
// const password = await bcrypt.hash(user.password, 10);
// const availableBinomUsers = await client.binomUser.findMany({
// where: {
// user: null
// },
// include: {
// user: true
// }
// })
// user.password = password;
// await client.user.create({
// data: {
// ...user,
// teamId: getRandomValue(existingTeams).id,
// binomUserId: getRandomValue(availableBinomUsers)?.id
// }
// });
// }
// }
// async function addTonicAccounts(data: ProviderAccount[], client: PrismaClient) {
// const tonicAccounts = await client.providerAccount.findMany();
// for(let account of data) {
// const tonicAccountExist = tonicAccounts.find(tonicAccount => tonicAccount.consumerKey === account.consumerKey);
// if(!tonicAccountExist) {
// await client.providerAccount.create({
// data: account
// })
// }
// }
// }
// // async function addWorkers(data: WorkerEntity[], client: PrismaClient) {
// // const workers = await client.workerEntity.findMany();
// // for(let worker of data) {
// // if(isWorkerExistInArray(worker, workers)) continue; // if exist - do not add
// // await client.workerEntity.create({
// // data: worker
// // })
// // }
// // }
// function isWorkerExistInArray(worker: WorkerEntity, array: WorkerEntity[]): boolean {
// const existedWorker = array.find(dbWorker => (dbWorker.fileName === worker.fileName) && (dbWorker.type === worker.type));
// return existedWorker ? true : false;
// }
// function isUserExistInArray(user: User, array: User[]): boolean {
// const existedUser = array.find(dbUser => dbUser.email === user.email);
// return existedUser ? true : false;
// }
main();