Files
frontend/src/services/post/voteService.ts

135 lines
3.4 KiB
TypeScript
Raw Normal View History

/**
*
* API调用
*/
2026-04-13 01:30:37 +08:00
import { api } from '../core/api';
import { Post, VoteResultDTO, CreateVotePostRequest, MessageSegment } from '@/types';
// 投票响应
interface VoteResponse {
success: boolean;
message?: string;
}
// 更新投票选项响应
interface UpdateVoteOptionResponse {
success: boolean;
message?: string;
}
/**
*
*/
class VoteService {
/**
* POST /posts vote segment
*/
async createVotePost(data: CreateVotePostRequest): Promise<Post | null> {
if (!data.vote_options || data.vote_options.length < 2) {
console.error('[VoteService] 投票选项至少需要2个');
return null;
}
if (data.vote_options.length > 10) {
console.error('[VoteService] 投票选项最多10个');
return null;
}
// 构建 segments先放文本内容再放投票 segment
const segments: MessageSegment[] = [];
if (data.content) {
segments.push({ type: 'text', data: { text: data.content } });
}
segments.push({
type: 'vote',
data: {
options: data.vote_options.map((opt, i) => ({
id: `opt_${i + 1}`,
content: typeof opt === 'string' ? opt : opt.content,
})),
max_choices: 1,
is_multi_choice: false,
},
});
const response = await api.post<Post>('/posts', {
title: data.title,
content: data.content || '',
segments,
images: data.images,
channel_id: data.channel_id,
});
return response.data;
}
/**
*
* @param postId ID
* @returns null
*/
async getVoteResult(postId: string): Promise<VoteResultDTO | null> {
try {
const response = await api.get<VoteResultDTO>(`/posts/${postId}/vote`);
return response.data;
} catch (error) {
console.error('[VoteService] 获取投票结果失败:', error);
return null;
}
}
/**
*
* @param postId ID
* @param optionId ID
* @returns
*/
async vote(postId: string, optionId: string): Promise<boolean> {
try {
const response = await api.post<VoteResponse>(`/posts/${postId}/vote`, {
option_id: optionId,
});
return response.data.success;
} catch (error) {
console.error('[VoteService] 投票失败:', error);
return false;
}
}
/**
*
* @param postId ID
* @returns
*/
async unvote(postId: string): Promise<boolean> {
try {
const response = await api.delete<VoteResponse>(`/posts/${postId}/vote`);
return response.data.success;
} catch (error) {
console.error('[VoteService] 取消投票失败:', error);
return false;
}
}
/**
*
* @param optionId ID
* @param content
* @param postId ID
* @returns
*/
async updateVoteOption(optionId: string, content: string, postId: string): Promise<boolean> {
try {
const response = await api.put<UpdateVoteOptionResponse>(
`/posts/${postId}/vote/options/${optionId}`,
{ content }
);
return response.data.success;
} catch (error) {
console.error('[VoteService] 更新投票选项失败:', error);
return false;
}
}
}
export const voteService = new VoteService();