import {faker} from '@faker-js/faker' import {debug} from 'common/logger' import {PrivateUser} from 'common/user' import {getDefaultNotificationPreferences} from 'common/user-notification-preferences' import {cleanUsername} from 'common/util/clean-username' import {randomString} from 'common/util/random' import {createSupabaseDirectClient} from 'shared/supabase/init' import {insert} from 'shared/supabase/utils' import {getUser} from 'shared/utils' import UserAccountInformationForSeeding from '../backend/utils/userInformation' import {firebaseSignUp} from './firebaseUtils' /** * Function used to populate the database with profiles. * * @param userInfo - Class object containing information to create a user account generated by `fakerjs`. * @param profileType - Optional param used to signify how much information is used in the account generation. */ export async function seedDbUser( userInfo: UserAccountInformationForSeeding, profileType?: string, ): Promise { const pg = createSupabaseDirectClient() const userId = userInfo.user_id const deviceToken = randomString() const bio = { type: 'doc', content: [ { type: 'paragraph', content: [ { text: userInfo.bio, type: 'text', }, ], }, ], } const relationshipStyle = userInfo.randomElement(userInfo.pref_relation_styles) let romanticStyle: string | null = null if (relationshipStyle === 'relationship') { romanticStyle = userInfo.randomElement(userInfo.pref_romantic_styles) } const numberOfLanguages = faker.number.int({min: 1, max: 3}) const languagesKnown = [] for (let i = 0; i < numberOfLanguages; i++) { languagesKnown.push(userInfo.randomElement(userInfo.languages)) } const keywords = faker.number.int({min: 1, max: 4}) const profileKeywords = [] for (let i = 0; i < keywords; i++) { profileKeywords.push(userInfo.keywords) } const basicProfile = { user_id: userId, bio_length: userInfo.bio.length, bio: bio, age: userInfo.age, gender: userInfo.randomElement(userInfo.gender), headline: userInfo.headline, keywords: profileKeywords, ethnicity: [userInfo.randomElement(userInfo.ethnicity)], height_in_inches: userInfo.height_in_inches, pref_gender: [userInfo.randomElement(userInfo.pref_gender)], pref_relation_styles: [relationshipStyle], relationship_status: [userInfo.randomElement(userInfo.relationship_status)], pref_romantic_styles: romanticStyle ? [romanticStyle] : [], pref_age_min: userInfo.pref_age.min, pref_age_max: userInfo.pref_age.max, born_in_location: userInfo.born_in_location, company: userInfo.company, occupation_title: userInfo.occupation_title, religion: [userInfo.randomElement(userInfo.religion)], has_kids: userInfo.has_kids, wants_kids_strength: userInfo.wants_kids_strength, is_smoker: userInfo.is_smoker, } const mediumProfile = { ...basicProfile, drinks_per_month: userInfo.drinks_per_month, diet: [userInfo.randomElement(userInfo.diet)], education_level: userInfo.randomElement(userInfo.education_level), languages: languagesKnown, } const fullProfile = { ...mediumProfile, cannabis: userInfo.randomElement(userInfo.cannabis), psychedelics: userInfo.randomElement(userInfo.psychedelics), cannabis_intention: [userInfo.randomElement(userInfo.cannabis_intention)], psychedelics_intention: [userInfo.randomElement(userInfo.psychedelics_intention)], cannabis_pref: [userInfo.randomElement(userInfo.cannabis_pref)], psychedelics_pref: [userInfo.randomElement(userInfo.psychedelics_pref)], political_beliefs: [userInfo.randomElement(userInfo.political_beliefs)], mbti: userInfo.randomElement(userInfo.mbti), big5_openness: userInfo.big5_openness, big5_conscientiousness: userInfo.big5_conscientiousness, big5_extraversion: userInfo.big5_extraversion, big5_agreeableness: userInfo.big5_agreeableness, big5_neuroticism: userInfo.big5_neuroticism, } const profileData = profileType === 'basic' ? basicProfile : profileType === 'medium' ? mediumProfile : fullProfile const privateUser: PrivateUser = { id: userId, email: userInfo.email, initialIpAddress: userInfo.ip, initialDeviceToken: deviceToken, notificationPreferences: getDefaultNotificationPreferences(), blockedUserIds: [], blockedByUserIds: [], } return pg.tx(async (tx: any) => { const preexistingUser = await getUser(userId, tx) if (preexistingUser) return false await insert(tx, 'users', { id: userId, name: userInfo.name, username: cleanUsername(userInfo.userName), data: {}, }) await insert(tx, 'private_users', { id: userId, data: privateUser, }) await insert(tx, 'profiles', profileData) return true }) } export async function seedUser( email?: string | undefined, password?: string | undefined, profileType?: string | undefined, displayName?: string | undefined, userName?: string | undefined, ) { const userInfo = new UserAccountInformationForSeeding() if (email) userInfo.email = email if (password) userInfo.password = password if (displayName) userInfo.name = displayName if (userName) userInfo.userName = userName userInfo.user_id = await firebaseSignUp(userInfo.email, userInfo.password) if (userInfo.user_id) { const created = await seedDbUser(userInfo, profileType ?? 'full') if (created) debug('User created in Firebase and Supabase:', userInfo.email) } }