Add Telegram ownership for voice reviews
All checks were successful
Build and deploy Backend / build (push) Successful in 1m1s

This commit is contained in:
Ruslan Bakiev
2026-05-08 16:44:32 +07:00
parent bba9c98c82
commit f956148141
14 changed files with 2107 additions and 111 deletions

View File

@@ -1,7 +1,12 @@
import { GraphQLJSONObject } from './scalars.js';
import { getOrCreateTelegramUser, requireTelegramUser } from '../auth/telegram.js';
import { listPlaces, listVoiceExperiences } from './places.js';
import { createVoiceExperience } from './voice-experiences.js';
export type GraphqlContext = {
telegramInitData?: string;
};
export const schema = /* GraphQL */ `
scalar JSON
@@ -23,9 +28,20 @@ export const schema = /* GraphQL */ `
experiences: [VoiceExperience!]!
}
type User {
id: ID!
telegramId: String!
username: String
firstName: String
lastName: String
photoUrl: String
languageCode: String
}
type VoiceExperience {
id: ID!
place: Place!
user: User
status: VoiceExperienceStatus!
durationSeconds: Int!
audioObjectKey: String!
@@ -43,6 +59,14 @@ export const schema = /* GraphQL */ `
audioObjectKey: String!
}
input AuthenticateTelegramInput {
initData: String!
}
type AuthPayload {
user: User!
}
type Query {
health: String!
places: [Place!]!
@@ -50,6 +74,7 @@ export const schema = /* GraphQL */ `
}
type Mutation {
authenticateTelegram(input: AuthenticateTelegramInput!): AuthPayload!
createVoiceExperience(input: CreateVoiceExperienceInput!): VoiceExperience!
}
`;
@@ -62,9 +87,18 @@ export const resolvers = {
voiceExperiences: () => listVoiceExperiences(),
},
Mutation: {
authenticateTelegram: async (
_: unknown,
args: { input: { initData: string } },
) => ({ user: await getOrCreateTelegramUser(args.input.initData) }),
createVoiceExperience: async (
_: unknown,
args: { input: Parameters<typeof createVoiceExperience>[0] },
) => createVoiceExperience(args.input),
context: unknown,
) => {
const graphqlContext = context as GraphqlContext;
const user = await requireTelegramUser(graphqlContext.telegramInitData);
return createVoiceExperience(args.input, user.id);
},
},
};