65 lines
1.8 KiB
JavaScript
65 lines
1.8 KiB
JavaScript
const cloud = require('wx-server-sdk')
|
|
|
|
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
|
|
const db = cloud.database()
|
|
|
|
// Generate a unique handle from openid
|
|
function makeHandle(openid) {
|
|
const suffix = openid.slice(-6).toLowerCase()
|
|
return `@user_${suffix}`
|
|
}
|
|
|
|
// Deterministic gradient swatch (.gradient-avatar-1..6) from the user's openid, so
|
|
// a user who hasn't set a real avatar always gets the same stable colour.
|
|
function gradientAvatarKey(seed) {
|
|
let h = 5381
|
|
for (let i = 0; i < seed.length; i++) {
|
|
h = ((h << 5) + h) ^ seed.charCodeAt(i)
|
|
h >>>= 0
|
|
}
|
|
return `gradient-avatar-${(h % 6) + 1}`
|
|
}
|
|
|
|
exports.main = async event => {
|
|
const { OPENID } = cloud.getWXContext()
|
|
if (!OPENID) throw new Error('no openid in wx context')
|
|
|
|
const now = Date.now()
|
|
const existed = await db.collection('users').where({ openid: OPENID }).limit(1).get()
|
|
|
|
if (existed.data.length) {
|
|
const user = existed.data[0]
|
|
await db.collection('users').doc(user._id).update({
|
|
data: { lastLoginAt: now }
|
|
})
|
|
return {
|
|
openid: OPENID,
|
|
user: { ...user, lastLoginAt: now },
|
|
isNew: false
|
|
}
|
|
}
|
|
|
|
// New user — create with sensible defaults
|
|
const avatarKey = gradientAvatarKey(OPENID)
|
|
const user = {
|
|
openid: OPENID,
|
|
nickname: event.userInfo?.nickname || '宠物达人',
|
|
handle: makeHandle(OPENID),
|
|
avatarKey,
|
|
avatarUrl: '',
|
|
profileCompleted: false,
|
|
location: '',
|
|
yearsWithPets: 0,
|
|
level: 1,
|
|
bio: '',
|
|
verified: false,
|
|
stats: { posts: 0, following: 0, followers: 0 },
|
|
preferences: { notifications: true, nearbyVisible: true },
|
|
createdAt: now,
|
|
lastLoginAt: now
|
|
}
|
|
|
|
const result = await db.collection('users').add({ data: user })
|
|
return { openid: OPENID, user: { _id: result._id, ...user }, isNew: true }
|
|
}
|