top users query
This commit is contained in:
parent
8e5327022d
commit
3e17eb1688
@ -1,7 +1,30 @@
|
|||||||
import { AuthenticationError, UserInputError } from 'apollo-server-errors'
|
import { AuthenticationError, UserInputError } from 'apollo-server-errors'
|
||||||
|
import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor'
|
||||||
import { createMentions, getItem, SELECT } from './item'
|
import { createMentions, getItem, SELECT } from './item'
|
||||||
import serialize from './serial'
|
import serialize from './serial'
|
||||||
|
|
||||||
|
export function topClause (within) {
|
||||||
|
let interval = ' AND "ItemAct".created_at >= $1 - INTERVAL '
|
||||||
|
switch (within) {
|
||||||
|
case 'day':
|
||||||
|
interval += "'1 day'"
|
||||||
|
break
|
||||||
|
case 'week':
|
||||||
|
interval += "'7 days'"
|
||||||
|
break
|
||||||
|
case 'month':
|
||||||
|
interval += "'1 month'"
|
||||||
|
break
|
||||||
|
case 'year':
|
||||||
|
interval += "'1 year'"
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
interval = ''
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return interval
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Query: {
|
Query: {
|
||||||
me: async (parent, args, { models, me }) =>
|
me: async (parent, args, { models, me }) =>
|
||||||
@ -17,6 +40,25 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return me.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } }))
|
return me.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } }))
|
||||||
|
},
|
||||||
|
topUsers: async (parent, { cursor, within }, { 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".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)
|
||||||
|
|
||||||
|
return {
|
||||||
|
cursor: users.length === LIMIT ? nextCursorEncoded(decodedCursor) : null,
|
||||||
|
users
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -97,6 +139,9 @@ export default {
|
|||||||
return await models.item.count({ where: { userId: user.id, parentId: { not: null } } })
|
return await models.item.count({ where: { userId: user.id, parentId: { not: null } } })
|
||||||
},
|
},
|
||||||
stacked: async (user, args, { models }) => {
|
stacked: async (user, args, { models }) => {
|
||||||
|
if (user.stacked) {
|
||||||
|
return user.stacked
|
||||||
|
}
|
||||||
const [{ sum }] = await models.$queryRaw`
|
const [{ sum }] = await models.$queryRaw`
|
||||||
SELECT sum("ItemAct".sats)
|
SELECT sum("ItemAct".sats)
|
||||||
FROM "ItemAct"
|
FROM "ItemAct"
|
||||||
|
@ -6,6 +6,12 @@ export default gql`
|
|||||||
user(name: String!): User
|
user(name: String!): User
|
||||||
users: [User!]
|
users: [User!]
|
||||||
nameAvailable(name: String!): Boolean!
|
nameAvailable(name: String!): Boolean!
|
||||||
|
topUsers(cursor: String, within: String!): Users
|
||||||
|
}
|
||||||
|
|
||||||
|
type Users {
|
||||||
|
cursor: String
|
||||||
|
users: [User!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
extend type Mutation {
|
extend type Mutation {
|
||||||
|
23
pages/top/users/[within].js
Normal file
23
pages/top/users/[within].js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Layout from '../../../components/layout'
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
import { getGetServerSideProps } from '../../../api/ssrApollo'
|
||||||
|
import TopHeader from '../../../components/top-header'
|
||||||
|
import { MORE_FLAT_COMMENTS } from '../../../fragments/comments'
|
||||||
|
import CommentsFlat from '../../../components/comments-flat'
|
||||||
|
|
||||||
|
export const getServerSideProps = getGetServerSideProps(MORE_FLAT_COMMENTS, { sort: 'top' })
|
||||||
|
|
||||||
|
export default function Index ({ data: { moreFlatComments: { comments, cursor } } }) {
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<TopHeader cat='comments' />
|
||||||
|
<CommentsFlat
|
||||||
|
comments={comments} cursor={cursor}
|
||||||
|
variables={{ sort: 'top', within: router.query?.within }}
|
||||||
|
includeParent noReply
|
||||||
|
/>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user