mirror of
https://github.com/lukevella/rallly.git
synced 2025-05-02 19:56:05 +02:00
♻️ Deprecating touch beacon
This commit is contained in:
parent
6b914610d9
commit
077ae79e80
7 changed files with 10 additions and 32 deletions
|
@ -24,8 +24,9 @@ description: "Frequently asked questions about Rallly."
|
||||||
</Accordion>
|
</Accordion>
|
||||||
|
|
||||||
<Accordion title="How long will Rallly keep my poll?">
|
<Accordion title="How long will Rallly keep my poll?">
|
||||||
Polls are automatically deleted when all date options are in the past AND the
|
For free users, polls are automatically marked for deletion when all date
|
||||||
poll has not been accessed for over 30 days. This does not apply to Pro users.
|
options are more than 30 days in the past. For Pro users, polls are never
|
||||||
|
automatically deleted.
|
||||||
</Accordion>
|
</Accordion>
|
||||||
|
|
||||||
<Accordion title="Can I limit the number of participants that can vote for an option?">
|
<Accordion title="Can I limit the number of participants that can vote for an option?">
|
||||||
|
|
|
@ -8,7 +8,6 @@ import { PollFooter } from "@/components/poll/poll-footer";
|
||||||
import { PollHeader } from "@/components/poll/poll-header";
|
import { PollHeader } from "@/components/poll/poll-header";
|
||||||
import { ResponsiveResults } from "@/components/poll/responsive-results";
|
import { ResponsiveResults } from "@/components/poll/responsive-results";
|
||||||
import { ScheduledEvent } from "@/components/poll/scheduled-event";
|
import { ScheduledEvent } from "@/components/poll/scheduled-event";
|
||||||
import { useTouchBeacon } from "@/components/poll/use-touch-beacon";
|
|
||||||
import { VotingForm } from "@/components/poll/voting-form";
|
import { VotingForm } from "@/components/poll/voting-form";
|
||||||
import { Trans } from "@/components/trans";
|
import { Trans } from "@/components/trans";
|
||||||
import { useUser } from "@/components/user-provider";
|
import { useUser } from "@/components/user-provider";
|
||||||
|
@ -51,7 +50,6 @@ const GoToApp = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
export function InvitePage() {
|
export function InvitePage() {
|
||||||
useTouchBeacon();
|
|
||||||
return (
|
return (
|
||||||
<div className="mx-auto max-w-4xl space-y-3 p-3 lg:space-y-4 lg:px-4 lg:py-8">
|
<div className="mx-auto max-w-4xl space-y-3 p-3 lg:space-y-4 lg:px-4 lg:py-8">
|
||||||
<PollHeader />
|
<PollHeader />
|
||||||
|
|
|
@ -5,14 +5,12 @@ import { PollFooter } from "@/components/poll/poll-footer";
|
||||||
import { PollHeader } from "@/components/poll/poll-header";
|
import { PollHeader } from "@/components/poll/poll-header";
|
||||||
import { ResponsiveResults } from "@/components/poll/responsive-results";
|
import { ResponsiveResults } from "@/components/poll/responsive-results";
|
||||||
import { ScheduledEvent } from "@/components/poll/scheduled-event";
|
import { ScheduledEvent } from "@/components/poll/scheduled-event";
|
||||||
import { useTouchBeacon } from "@/components/poll/use-touch-beacon";
|
|
||||||
import { VotingForm } from "@/components/poll/voting-form";
|
import { VotingForm } from "@/components/poll/voting-form";
|
||||||
|
|
||||||
import { GuestPollAlert } from "./guest-poll-alert";
|
import { GuestPollAlert } from "./guest-poll-alert";
|
||||||
import { UnsubscribeAlert } from "./unsubscribe-alert";
|
import { UnsubscribeAlert } from "./unsubscribe-alert";
|
||||||
|
|
||||||
export function AdminPage() {
|
export function AdminPage() {
|
||||||
useTouchBeacon();
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-3 lg:space-y-4">
|
<div className="space-y-3 lg:space-y-4">
|
||||||
<UnsubscribeAlert />
|
<UnsubscribeAlert />
|
||||||
|
|
|
@ -4,8 +4,8 @@ import { NextResponse } from "next/server";
|
||||||
import { checkApiAuthorization } from "@/utils/api-auth";
|
import { checkApiAuthorization } from "@/utils/api-auth";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks inactive polls as deleted. Polls are inactive if they have not been
|
* Marks inactive polls as deleted. Polls are inactive if the last option is more than
|
||||||
* touched in the last 30 days and all dates are in the past.
|
* 30 days in the past.
|
||||||
* Only marks polls as deleted if they belong to users without an active subscription
|
* Only marks polls as deleted if they belong to users without an active subscription
|
||||||
* or if they don't have a user associated with them.
|
* or if they don't have a user associated with them.
|
||||||
*/
|
*/
|
||||||
|
@ -16,14 +16,11 @@ export async function POST() {
|
||||||
// Mark inactive polls as deleted in a single query
|
// Mark inactive polls as deleted in a single query
|
||||||
const { count: markedDeleted } = await prisma.poll.updateMany({
|
const { count: markedDeleted } = await prisma.poll.updateMany({
|
||||||
where: {
|
where: {
|
||||||
touchedAt: {
|
|
||||||
lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), // 30 days ago
|
|
||||||
},
|
|
||||||
deleted: false,
|
deleted: false,
|
||||||
options: {
|
options: {
|
||||||
none: {
|
none: {
|
||||||
startTime: {
|
startTime: {
|
||||||
gt: new Date(),
|
lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
import { useMount } from "react-use";
|
|
||||||
|
|
||||||
import { usePoll } from "@/contexts/poll";
|
|
||||||
import { trpc } from "@/trpc/client";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Touching a poll updates a column with the current date. This information is used to
|
|
||||||
* find polls that haven't been accessed for some time so that they can be deleted by house keeping.
|
|
||||||
*/
|
|
||||||
export const useTouchBeacon = () => {
|
|
||||||
const poll = usePoll();
|
|
||||||
const touchMutation = trpc.polls.touch.useMutation({
|
|
||||||
meta: { doNotInvalidate: true },
|
|
||||||
});
|
|
||||||
|
|
||||||
useMount(() => {
|
|
||||||
touchMutation.mutate({ pollId: poll.id });
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -365,6 +365,9 @@ export const polls = router({
|
||||||
data: { deleted: true, deletedAt: new Date() },
|
data: { deleted: true, deletedAt: new Date() },
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
touch: publicProcedure
|
touch: publicProcedure
|
||||||
.input(
|
.input(
|
||||||
z.object({
|
z.object({
|
||||||
|
|
|
@ -151,7 +151,7 @@ model Poll {
|
||||||
status PollStatus @default(live)
|
status PollStatus @default(live)
|
||||||
deleted Boolean @default(false)
|
deleted Boolean @default(false)
|
||||||
deletedAt DateTime? @map("deleted_at")
|
deletedAt DateTime? @map("deleted_at")
|
||||||
touchedAt DateTime @default(now()) @map("touched_at")
|
touchedAt DateTime @default(now()) @map("touched_at") // @deprecated
|
||||||
participantUrlId String @unique @map("participant_url_id")
|
participantUrlId String @unique @map("participant_url_id")
|
||||||
adminUrlId String @unique @map("admin_url_id")
|
adminUrlId String @unique @map("admin_url_id")
|
||||||
eventId String? @unique @map("event_id")
|
eventId String? @unique @map("event_id")
|
||||||
|
|
Loading…
Add table
Reference in a new issue