top cowboys

This commit is contained in:
keyan 2023-02-09 12:41:28 -06:00
parent a5b2de64d3
commit 97f74da0fd
6 changed files with 102 additions and 20 deletions

View File

@ -90,6 +90,20 @@ export default {
return user.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } })) return user.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } }))
}, },
topCowboys: async (parent, { cursor }, { models, me }) => {
const decodedCursor = decodeCursor(cursor)
const users = await models.$queryRaw(`
SELECT users.*
FROM users
WHERE NOT "hideFromTopUsers" AND streak IS NOT NULL
ORDER BY streak DESC, created_at ASC
OFFSET $1
LIMIT ${LIMIT}`, decodedCursor.offset)
return {
cursor: users.length === LIMIT ? nextCursorEncoded(decodedCursor) : null,
users
}
},
topUsers: async (parent, { cursor, when, sort }, { models, me }) => { topUsers: async (parent, { cursor, when, sort }, { models, me }) => {
const decodedCursor = decodeCursor(cursor) const decodedCursor = decodeCursor(cursor)
let users let users
@ -151,7 +165,7 @@ export default {
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)
} else { } else {
users = await models.$queryRaw(` users = await models.$queryRaw(`
SELECT u.id, u.name, u."photoId", floor(sum(amount)/1000) as stacked SELECT u.id, u.name, u.streak, u."photoId", floor(sum(amount)/1000) as stacked
FROM FROM
((SELECT users.*, "ItemAct".msats as amount ((SELECT users.*, "ItemAct".msats as amount
FROM "ItemAct" FROM "ItemAct"
@ -172,7 +186,7 @@ export default {
JOIN users on users.id = "ReferralAct"."referrerId" JOIN users on users.id = "ReferralAct"."referrerId"
WHERE "ReferralAct".msats > 0 ${within('ReferralAct', when)} WHERE "ReferralAct".msats > 0 ${within('ReferralAct', when)}
AND NOT users."hideFromTopUsers")) u AND NOT users."hideFromTopUsers")) u
GROUP BY u.id, u.name, u.created_at, u."photoId" GROUP BY u.id, u.name, u.created_at, u."photoId", u.streak
ORDER BY stacked DESC NULLS LAST, created_at DESC ORDER BY stacked DESC NULLS LAST, created_at DESC
OFFSET $2 OFFSET $2
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)

View File

@ -8,6 +8,7 @@ export default gql`
users: [User!] users: [User!]
nameAvailable(name: String!): Boolean! nameAvailable(name: String!): Boolean!
topUsers(cursor: String, when: String, sort: String): Users topUsers(cursor: String, when: String, sort: String): Users
topCowboys(cursor: String): Users
searchUsers(q: String!, limit: Int, similarity: Float): [User!]! searchUsers(q: String!, limit: Int, similarity: Float): [User!]!
hasNewNotes: Boolean! hasNewNotes: Boolean!
} }

View File

@ -10,6 +10,13 @@ export default function TopHeader ({ cat }) {
const top = async values => { const top = async values => {
const { what, when, ...query } = values const { what, when, ...query } = values
if (what === 'cowboys') {
await router.push({
pathname: `/top/${what}`
})
return
}
if (typeof query.sort !== 'undefined') { if (typeof query.sort !== 'undefined') {
if (query.sort === '' || if (query.sort === '' ||
(what === 'users' && !USER_SORTS.includes(query.sort)) || (what === 'users' && !USER_SORTS.includes(query.sort)) ||
@ -19,7 +26,7 @@ export default function TopHeader ({ cat }) {
} }
await router.push({ await router.push({
pathname: `/top/${what}/${when}`, pathname: `/top/${what}/${when || 'day'}`,
query query
}) })
} }
@ -42,8 +49,10 @@ export default function TopHeader ({ cat }) {
onChange={(formik, e) => top({ ...formik?.values, what: e.target.value })} onChange={(formik, e) => top({ ...formik?.values, what: e.target.value })}
name='what' name='what'
size='sm' size='sm'
items={['posts', 'comments', 'users']} items={['posts', 'comments', 'users', 'cowboys']}
/> />
{cat !== 'cowboys' &&
<>
by by
<Select <Select
groupClassName='mx-2 mb-0' groupClassName='mx-2 mb-0'
@ -60,6 +69,8 @@ export default function TopHeader ({ cat }) {
size='sm' size='sm'
items={['day', 'week', 'month', 'year', 'forever']} items={['day', 'week', 'month', 'year', 'forever']}
/> />
</>}
</div> </div>
</Form> </Form>
</div> </div>

View File

@ -151,6 +151,24 @@ export const TOP_USERS = gql`
} }
` `
export const TOP_COWBOYS = gql`
query TopCowboys($cursor: String) {
topCowboys(cursor: $cursor) {
users {
name
streak
photoId
stacked(when: "forever")
spent(when: "forever")
ncomments(when: "forever")
nitems(when: "forever")
referrals(when: "forever")
}
cursor
}
}
`
export const USER_FULL = gql` export const USER_FULL = gql`
${USER_FIELDS} ${USER_FIELDS}
${ITEM_WITH_COMMENTS} ${ITEM_WITH_COMMENTS}

View File

@ -49,6 +49,19 @@ function getClient (uri) {
} }
} }
}, },
topCowboys: {
keyArgs: [],
merge (existing, incoming) {
if (isFirstPage(incoming.cursor, existing?.users)) {
return incoming
}
return {
cursor: incoming.cursor,
users: [...(existing?.users || []), ...incoming.users]
}
}
},
items: { items: {
keyArgs: ['sub', 'sort', 'type', 'name', 'within'], keyArgs: ['sub', 'sort', 'type', 'name', 'within'],
merge (existing, incoming) { merge (existing, incoming) {

25
pages/top/cowboys.js Normal file
View File

@ -0,0 +1,25 @@
import Layout from '../../components/layout'
import { getGetServerSideProps } from '../../api/ssrApollo'
import TopHeader from '../../components/top-header'
import { TOP_COWBOYS } from '../../fragments/users'
import { useQuery } from '@apollo/client'
import MoreFooter from '../../components/more-footer'
import UserList, { UsersSkeleton } from '../../components/user-list'
export const getServerSideProps = getGetServerSideProps(TOP_COWBOYS)
export default function Index ({ data: { topCowboys: { users, cursor } } }) {
const { data, fetchMore } = useQuery(TOP_COWBOYS)
if (data) {
({ topCowboys: { users, cursor } } = data)
}
return (
<Layout>
<TopHeader cat='cowboys' />
<UserList users={users} />
<MoreFooter cursor={cursor} fetchMore={fetchMore} Skeleton={UsersSkeleton} />
</Layout>
)
}