mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-08-24 03:47:16 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5d7ca3d29a |
@@ -32,10 +32,6 @@ public enum NotificationType {
|
|||||||
REGISTER_REQUEST,
|
REGISTER_REQUEST,
|
||||||
/** A user redeemed an activity reward */
|
/** A user redeemed an activity reward */
|
||||||
ACTIVITY_REDEEM,
|
ACTIVITY_REDEEM,
|
||||||
/** You won a lottery post */
|
|
||||||
LOTTERY_WIN,
|
|
||||||
/** Your lottery post was drawn */
|
|
||||||
LOTTERY_DRAW,
|
|
||||||
/** You were mentioned in a post or comment */
|
/** You were mentioned in a post or comment */
|
||||||
MENTION
|
MENTION
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,8 +69,6 @@ public class PostService {
|
|||||||
private final EmailSender emailSender;
|
private final EmailSender emailSender;
|
||||||
private final ApplicationContext applicationContext;
|
private final ApplicationContext applicationContext;
|
||||||
private final ConcurrentMap<Long, ScheduledFuture<?>> scheduledFinalizations = new ConcurrentHashMap<>();
|
private final ConcurrentMap<Long, ScheduledFuture<?>> scheduledFinalizations = new ConcurrentHashMap<>();
|
||||||
@Value("${app.website-url:https://www.open-isle.com}")
|
|
||||||
private String websiteUrl;
|
|
||||||
|
|
||||||
@org.springframework.beans.factory.annotation.Autowired
|
@org.springframework.beans.factory.annotation.Autowired
|
||||||
public PostService(PostRepository postRepository,
|
public PostService(PostRepository postRepository,
|
||||||
@@ -251,15 +249,6 @@ public class PostService {
|
|||||||
if (w.getEmail() != null) {
|
if (w.getEmail() != null) {
|
||||||
emailSender.sendEmail(w.getEmail(), "你中奖了", "恭喜你在抽奖贴 \"" + lp.getTitle() + "\" 中获奖");
|
emailSender.sendEmail(w.getEmail(), "你中奖了", "恭喜你在抽奖贴 \"" + lp.getTitle() + "\" 中获奖");
|
||||||
}
|
}
|
||||||
notificationService.createNotification(w, NotificationType.LOTTERY_WIN, lp, null, null, lp.getAuthor(), null, null);
|
|
||||||
notificationService.sendCustomPush(w, "你中奖了", String.format("%s/posts/%d", websiteUrl, lp.getId()));
|
|
||||||
}
|
|
||||||
if (lp.getAuthor() != null) {
|
|
||||||
if (lp.getAuthor().getEmail() != null) {
|
|
||||||
emailSender.sendEmail(lp.getAuthor().getEmail(), "抽奖已开奖", "您的抽奖贴 \"" + lp.getTitle() + "\" 已开奖");
|
|
||||||
}
|
|
||||||
notificationService.createNotification(lp.getAuthor(), NotificationType.LOTTERY_DRAW, lp, null, null, null, null, null);
|
|
||||||
notificationService.sendCustomPush(lp.getAuthor(), "抽奖已开奖", String.format("%s/posts/%d", websiteUrl, lp.getId()));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,50 +93,4 @@ class PostServiceTest {
|
|||||||
() -> service.createPost("alice", 1L, "t", "c", List.of(1L),
|
() -> service.createPost("alice", 1L, "t", "c", List.of(1L),
|
||||||
null, null, null, null, null, null));
|
null, null, null, null, null, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
void finalizeLotteryNotifiesAuthor() {
|
|
||||||
PostRepository postRepo = mock(PostRepository.class);
|
|
||||||
UserRepository userRepo = mock(UserRepository.class);
|
|
||||||
CategoryRepository catRepo = mock(CategoryRepository.class);
|
|
||||||
TagRepository tagRepo = mock(TagRepository.class);
|
|
||||||
LotteryPostRepository lotteryRepo = mock(LotteryPostRepository.class);
|
|
||||||
NotificationService notifService = mock(NotificationService.class);
|
|
||||||
SubscriptionService subService = mock(SubscriptionService.class);
|
|
||||||
CommentService commentService = mock(CommentService.class);
|
|
||||||
CommentRepository commentRepo = mock(CommentRepository.class);
|
|
||||||
ReactionRepository reactionRepo = mock(ReactionRepository.class);
|
|
||||||
PostSubscriptionRepository subRepo = mock(PostSubscriptionRepository.class);
|
|
||||||
NotificationRepository notificationRepo = mock(NotificationRepository.class);
|
|
||||||
PostReadService postReadService = mock(PostReadService.class);
|
|
||||||
ImageUploader imageUploader = mock(ImageUploader.class);
|
|
||||||
TaskScheduler taskScheduler = mock(TaskScheduler.class);
|
|
||||||
EmailSender emailSender = mock(EmailSender.class);
|
|
||||||
ApplicationContext context = mock(ApplicationContext.class);
|
|
||||||
|
|
||||||
PostService service = new PostService(postRepo, userRepo, catRepo, tagRepo, lotteryRepo,
|
|
||||||
notifService, subService, commentService, commentRepo,
|
|
||||||
reactionRepo, subRepo, notificationRepo, postReadService,
|
|
||||||
imageUploader, taskScheduler, emailSender, context, PublishMode.DIRECT);
|
|
||||||
when(context.getBean(PostService.class)).thenReturn(service);
|
|
||||||
|
|
||||||
User author = new User();
|
|
||||||
author.setId(1L);
|
|
||||||
User winner = new User();
|
|
||||||
winner.setId(2L);
|
|
||||||
|
|
||||||
LotteryPost lp = new LotteryPost();
|
|
||||||
lp.setId(1L);
|
|
||||||
lp.setAuthor(author);
|
|
||||||
lp.setTitle("L");
|
|
||||||
lp.setPrizeCount(1);
|
|
||||||
lp.getParticipants().add(winner);
|
|
||||||
|
|
||||||
when(lotteryRepo.findById(1L)).thenReturn(Optional.of(lp));
|
|
||||||
|
|
||||||
service.finalizeLottery(1L);
|
|
||||||
|
|
||||||
verify(notifService).createNotification(eq(winner), eq(NotificationType.LOTTERY_WIN), eq(lp), isNull(), isNull(), eq(author), isNull(), isNull());
|
|
||||||
verify(notifService).createNotification(eq(author), eq(NotificationType.LOTTERY_DRAW), eq(lp), isNull(), isNull(), isNull(), isNull(), isNull());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
NUXT_PUBLIC_API_BASE_URL=https://www.open-isle.com
|
||||||
|
NUXT_PUBLIC_GOOGLE_CLIENT_ID=777830451304-xxx.apps.googleusercontent.com
|
||||||
|
NUXT_PUBLIC_GITHUB_CLIENT_ID=Ov23liVkO1NPAX5JyWxJ
|
||||||
|
NUXT_PUBLIC_DISCORD_CLIENT_ID=1394985417044000779
|
||||||
|
NUXT_PUBLIC_TWITTER_CLIENT_ID=ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
export const API_BASE_URL = 'https://www.open-isle.com'
|
import { useRuntimeConfig } from '#app'
|
||||||
// export const API_BASE_URL = 'http://127.0.0.1:8081'
|
|
||||||
// export const API_BASE_URL = 'http://30.211.97.238:8081'
|
const config = useRuntimeConfig()
|
||||||
export const GOOGLE_CLIENT_ID =
|
|
||||||
'777830451304-nt8afkkap18gui4f9entcha99unal744.apps.googleusercontent.com'
|
export const API_BASE_URL = config.public.apiBaseUrl
|
||||||
export const GITHUB_CLIENT_ID = 'Ov23liVkO1NPAX5JyWxJ'
|
export const GOOGLE_CLIENT_ID = config.public.googleClientId
|
||||||
export const DISCORD_CLIENT_ID = '1394985417044000779'
|
export const GITHUB_CLIENT_ID = config.public.githubClientId
|
||||||
export const TWITTER_CLIENT_ID = 'ZTRTU05KSk9KTTJrTTdrVC1tc1E6MTpjaQ'
|
export const DISCORD_CLIENT_ID = config.public.discordClientId
|
||||||
|
export const TWITTER_CLIENT_ID = config.public.twitterClientId
|
||||||
|
|
||||||
// 重新导出 toast 功能,使用 composable 方式
|
// 重新导出 toast 功能,使用 composable 方式
|
||||||
export { toast } from './composables/useToast'
|
export { toast } from './composables/useToast'
|
||||||
|
|||||||
@@ -2,6 +2,15 @@ import { defineNuxtConfig } from 'nuxt/config'
|
|||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
ssr: true,
|
ssr: true,
|
||||||
|
runtimeConfig: {
|
||||||
|
public: {
|
||||||
|
apiBaseUrl: process.env.NUXT_PUBLIC_API_BASE_URL || '',
|
||||||
|
googleClientId: process.env.NUXT_PUBLIC_GOOGLE_CLIENT_ID || '',
|
||||||
|
githubClientId: process.env.NUXT_PUBLIC_GITHUB_CLIENT_ID || '',
|
||||||
|
discordClientId: process.env.NUXT_PUBLIC_DISCORD_CLIENT_ID || '',
|
||||||
|
twitterClientId: process.env.NUXT_PUBLIC_TWITTER_CLIENT_ID || '',
|
||||||
|
},
|
||||||
|
},
|
||||||
// Ensure Vditor styles load before our overrides in global.css
|
// Ensure Vditor styles load before our overrides in global.css
|
||||||
css: ['vditor/dist/index.css', '~/assets/global.css'],
|
css: ['vditor/dist/index.css', '~/assets/global.css'],
|
||||||
app: {
|
app: {
|
||||||
|
|||||||
@@ -185,32 +185,6 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
</NotificationContainer>
|
</NotificationContainer>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.type === 'LOTTERY_WIN'">
|
|
||||||
<NotificationContainer :item="item" :markRead="markRead">
|
|
||||||
恭喜你在抽奖贴
|
|
||||||
<router-link
|
|
||||||
class="notif-content-text"
|
|
||||||
@click="markRead(item.id)"
|
|
||||||
:to="`/posts/${item.post.id}`"
|
|
||||||
>
|
|
||||||
{{ stripMarkdownLength(item.post.title, 100) }}
|
|
||||||
</router-link>
|
|
||||||
中获奖
|
|
||||||
</NotificationContainer>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.type === 'LOTTERY_DRAW'">
|
|
||||||
<NotificationContainer :item="item" :markRead="markRead">
|
|
||||||
您的抽奖贴
|
|
||||||
<router-link
|
|
||||||
class="notif-content-text"
|
|
||||||
@click="markRead(item.id)"
|
|
||||||
:to="`/posts/${item.post.id}`"
|
|
||||||
>
|
|
||||||
{{ stripMarkdownLength(item.post.title, 100) }}
|
|
||||||
</router-link>
|
|
||||||
已开奖
|
|
||||||
</NotificationContainer>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.type === 'POST_UPDATED'">
|
<template v-else-if="item.type === 'POST_UPDATED'">
|
||||||
<NotificationContainer :item="item" :markRead="markRead">
|
<NotificationContainer :item="item" :markRead="markRead">
|
||||||
您关注的帖子
|
您关注的帖子
|
||||||
@@ -591,8 +565,6 @@ export default {
|
|||||||
POST_UNSUBSCRIBED: 'fas fa-bookmark',
|
POST_UNSUBSCRIBED: 'fas fa-bookmark',
|
||||||
REGISTER_REQUEST: 'fas fa-user-clock',
|
REGISTER_REQUEST: 'fas fa-user-clock',
|
||||||
ACTIVITY_REDEEM: 'fas fa-coffee',
|
ACTIVITY_REDEEM: 'fas fa-coffee',
|
||||||
LOTTERY_WIN: 'fas fa-trophy',
|
|
||||||
LOTTERY_DRAW: 'fas fa-bullhorn',
|
|
||||||
MENTION: 'fas fa-at',
|
MENTION: 'fas fa-at',
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -650,28 +622,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
} else if (n.type === 'LOTTERY_WIN') {
|
|
||||||
notifications.value.push({
|
|
||||||
...n,
|
|
||||||
icon: iconMap[n.type],
|
|
||||||
iconClick: () => {
|
|
||||||
if (n.post) {
|
|
||||||
markRead(n.id)
|
|
||||||
router.push(`/posts/${n.post.id}`)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else if (n.type === 'LOTTERY_DRAW') {
|
|
||||||
notifications.value.push({
|
|
||||||
...n,
|
|
||||||
icon: iconMap[n.type],
|
|
||||||
iconClick: () => {
|
|
||||||
if (n.post) {
|
|
||||||
markRead(n.id)
|
|
||||||
router.push(`/posts/${n.post.id}`)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else if (n.type === 'POST_UPDATED') {
|
} else if (n.type === 'POST_UPDATED') {
|
||||||
notifications.value.push({
|
notifications.value.push({
|
||||||
...n,
|
...n,
|
||||||
@@ -841,10 +791,6 @@ export default {
|
|||||||
return '有人申请注册'
|
return '有人申请注册'
|
||||||
case 'ACTIVITY_REDEEM':
|
case 'ACTIVITY_REDEEM':
|
||||||
return '有人申请兑换奶茶'
|
return '有人申请兑换奶茶'
|
||||||
case 'LOTTERY_WIN':
|
|
||||||
return '抽奖中奖了'
|
|
||||||
case 'LOTTERY_DRAW':
|
|
||||||
return '抽奖已开奖'
|
|
||||||
default:
|
default:
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user