From 8829fccdeff453e4e57a21ba5c1d6674c6611ec5 Mon Sep 17 00:00:00 2001 From: keyan Date: Wed, 2 Feb 2022 15:50:12 -0600 Subject: [PATCH] add top spenders to top page --- api/resolvers/user.js | 38 ++++++++++++------ api/typeDefs/user.js | 13 ++++++- components/top-header.js | 41 +++++++++++++++----- fragments/users.js | 6 +-- pages/top/users/{ => [userType]}/[within].js | 17 ++++---- 5 files changed, 81 insertions(+), 34 deletions(-) rename pages/top/users/{ => [userType]}/[within].js (72%) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index b448d557..3253f09d 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -41,19 +41,33 @@ export default { return me.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } })) }, - topUsers: async (parent, { cursor, within }, { models, me }) => { + topUsers: async (parent, { cursor, within, userType }, { models, me }) => { const decodedCursor = decodeCursor(cursor) - const users = await models.$queryRaw(` - SELECT users.name, users.created_at, sum("ItemAct".sats) as stacked - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id - JOIN users on "Item"."userId" = users.id - WHERE act <> 'BOOST' AND "ItemAct"."userId" <> users.id AND "ItemAct".created_at <= $1 - ${topClause(within)} - GROUP BY users.id, users.name - ORDER BY stacked DESC NULLS LAST, users.created_at DESC - OFFSET $2 - LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) + let users + if (userType === 'spent') { + users = await models.$queryRaw(` + SELECT users.name, users.created_at, sum("ItemAct".sats) as amount + FROM "ItemAct" + JOIN users on "ItemAct"."userId" = users.id + WHERE "ItemAct".created_at <= $1 + ${topClause(within)} + GROUP BY users.id, users.name + ORDER BY amount DESC NULLS LAST, users.created_at DESC + OFFSET $2 + LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) + } else { + users = await models.$queryRaw(` + SELECT users.name, users.created_at, sum("ItemAct".sats) as amount + FROM "ItemAct" + JOIN "Item" on "ItemAct"."itemId" = "Item".id + JOIN users on "Item"."userId" = users.id + WHERE act <> 'BOOST' AND "ItemAct"."userId" <> users.id AND "ItemAct".created_at <= $1 + ${topClause(within)} + GROUP BY users.id, users.name + ORDER BY amount DESC NULLS LAST, users.created_at DESC + OFFSET $2 + LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) + } return { cursor: users.length === LIMIT ? nextCursorEncoded(decodedCursor) : null, diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index a461defe..41b83899 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -6,7 +6,7 @@ export default gql` user(name: String!): User users: [User!] nameAvailable(name: String!): Boolean! - topUsers(cursor: String, within: String!): Users + topUsers(cursor: String, within: String!, userType: String!): TopUsers } type Users { @@ -14,6 +14,17 @@ export default gql` users: [User!]! } + type TopUsers { + cursor: String + users: [TopUser!]! + } + + type TopUser { + name: String! + createdAt: String! + amount: Int! + } + extend type Mutation { setName(name: String!): Boolean setSettings(tipDefault: Int!): Boolean diff --git a/components/top-header.js b/components/top-header.js index 19a5c200..08250d15 100644 --- a/components/top-header.js +++ b/components/top-header.js @@ -6,20 +6,20 @@ import { useRouter } from 'next/router' export default function TopHeader ({ cat }) { const router = useRouter() const within = router.query.within + const userType = router.query.userType || 'stacked' return ( <> + {cat.split('/')[0] === 'users' && + + + }