Organized 'users' functionality vertically. (#226)

This commit is contained in:
Martin Šošić
2024-07-11 12:57:30 +02:00
committed by GitHub
parent 0e4e76ae88
commit a348a85660
16 changed files with 220 additions and 213 deletions

View File

@@ -2,8 +2,6 @@ import { type User, type Task } from 'wasp/entities';
import { HttpError } from 'wasp/server';
import {
type GenerateGptResponse,
type UpdateCurrentUser,
type UpdateUserById,
type CreateTask,
type DeleteTask,
type UpdateTask,
@@ -19,8 +17,6 @@ function setupOpenAI() {
return new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
}
type GptPayload = {
hours: string;
};
@@ -221,38 +217,3 @@ export const deleteTask: DeleteTask<Pick<Task, 'id'>, Task> = async ({ id }, con
return task;
};
export const updateUserById: UpdateUserById<{ id: string; data: Partial<User> }, User> = async (
{ id, data },
context
) => {
if (!context.user) {
throw new HttpError(401);
}
if (!context.user.isAdmin) {
throw new HttpError(403);
}
const updatedUser = await context.entities.User.update({
where: {
id,
},
data,
});
return updatedUser;
};
export const updateCurrentUser: UpdateCurrentUser<Partial<User>, User> = async (user, context) => {
if (!context.user) {
throw new HttpError(401);
}
return context.entities.User.update({
where: {
id: context.user.id,
},
data: user,
});
};

View File

@@ -3,10 +3,8 @@ import { HttpError } from 'wasp/server';
import {
type GetGptResponses,
type GetDailyStats,
type GetPaginatedUsers,
type GetAllTasksByUser,
} from 'wasp/server/operations';
import { type SubscriptionStatus } from '../payment/plans';
type DailyStatsWithSources = DailyStats & {
sources: PageViewSource[];
@@ -71,107 +69,3 @@ export const getDailyStats: GetDailyStats<void, DailyStatsValues> = async (_args
return { dailyStats, weeklyStats };
};
type GetPaginatedUsersInput = {
skip: number;
cursor?: number | undefined;
emailContains?: string;
isAdmin?: boolean;
subscriptionStatus?: SubscriptionStatus[];
};
type GetPaginatedUsersOutput = {
users: Pick<
User,
'id' | 'email' | 'username' | 'lastActiveTimestamp' | 'subscriptionStatus' | 'stripeId'
>[];
totalPages: number;
};
export const getPaginatedUsers: GetPaginatedUsers<GetPaginatedUsersInput, GetPaginatedUsersOutput> = async (
args,
context
) => {
if (!context.user?.isAdmin) {
throw new HttpError(401);
}
const allSubscriptionStatusOptions = args.subscriptionStatus as Array<string | null> | undefined;
const hasNotSubscribed = allSubscriptionStatusOptions?.find((status) => status === null)
let subscriptionStatusStrings = allSubscriptionStatusOptions?.filter((status) => status !== null) as string[] | undefined
const queryResults = await context.entities.User.findMany({
skip: args.skip,
take: 10,
where: {
AND: [
{
email: {
contains: args.emailContains || undefined,
mode: 'insensitive',
},
isAdmin: args.isAdmin,
},
{
OR: [
{
subscriptionStatus: {
in: subscriptionStatusStrings,
},
},
{
subscriptionStatus: {
equals: hasNotSubscribed,
},
},
],
},
],
},
select: {
id: true,
email: true,
username: true,
isAdmin: true,
lastActiveTimestamp: true,
subscriptionStatus: true,
stripeId: true,
},
orderBy: {
id: 'desc',
},
});
const totalUserCount = await context.entities.User.count({
where: {
AND: [
{
email: {
contains: args.emailContains || undefined,
mode: 'insensitive',
},
isAdmin: args.isAdmin,
},
{
OR: [
{
subscriptionStatus: {
in: subscriptionStatusStrings,
},
},
{
subscriptionStatus: {
equals: hasNotSubscribed,
},
},
],
},
],
},
});
const totalPages = Math.ceil(totalUserCount / 10);
return {
users: queryResults,
totalPages,
};
};