63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
|
import * as functions from 'firebase-functions'
|
||
|
import * as admin from 'firebase-admin'
|
||
|
|
||
|
import { STARTING_BALANCE, User } from '../../common/user'
|
||
|
import { getUser, getUserByUsername } from './utils'
|
||
|
import { randomString } from '../../common/util/random'
|
||
|
|
||
|
export const createUser = functions
|
||
|
.runWith({ minInstances: 1 })
|
||
|
.https.onCall(async (_, context) => {
|
||
|
const userId = context?.auth?.uid
|
||
|
if (!userId) return { status: 'error', message: 'Not authorized' }
|
||
|
|
||
|
const preexistingUser = await getUser(userId)
|
||
|
if (preexistingUser)
|
||
|
return {
|
||
|
status: 'error',
|
||
|
message: 'User already created',
|
||
|
user: preexistingUser,
|
||
|
}
|
||
|
|
||
|
const fbUser = await admin.auth().getUser(userId)
|
||
|
|
||
|
const email = fbUser.email
|
||
|
const emailName = email?.replace(/@.*$/, '')
|
||
|
|
||
|
const name = fbUser.displayName || emailName || 'User' + randomString(4)
|
||
|
let username = cleanUsername(name)
|
||
|
|
||
|
const sameNameUser = await getUserByUsername(username)
|
||
|
if (sameNameUser) {
|
||
|
username += randomString(4)
|
||
|
}
|
||
|
|
||
|
const avatarUrl = fbUser.photoURL
|
||
|
|
||
|
const user: User = {
|
||
|
id: userId,
|
||
|
name,
|
||
|
username,
|
||
|
avatarUrl,
|
||
|
balance: STARTING_BALANCE,
|
||
|
createdTime: Date.now(),
|
||
|
totalPnLCached: 0,
|
||
|
creatorVolumeCached: 0,
|
||
|
}
|
||
|
|
||
|
await firestore.collection('users').doc(userId).create(user)
|
||
|
console.log('created user', username, 'firebase id:', userId)
|
||
|
|
||
|
return { status: 'success', user }
|
||
|
})
|
||
|
|
||
|
const cleanUsername = (name: string) => {
|
||
|
return name
|
||
|
.replace(/\s+/g, '')
|
||
|
.normalize('NFD') // split an accented letter in the base letter and the acent
|
||
|
.replace(/[\u0300-\u036f]/g, '') // remove all previously split accents
|
||
|
.replace(/[^A-Za-z0-9_]/g, '') // remove all chars not letters, numbers and underscores
|
||
|
}
|
||
|
|
||
|
const firestore = admin.firestore()
|