Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions docs/api-specification.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,50 @@ paths:
aiMessage:
$ref: '#/components/schemas/AiChatMessage'

/api/aichat/sessions/{sessionId}/title:
patch:
tags:
- aichat
summary: AI 채팅 세션 제목 수정
description: AI 채팅 세션의 제목을 사용자가 직접 수정합니다
parameters:
- name: sessionId
in: path
required: true
schema:
type: integer
format: int64
description: AI 채팅 세션 ID
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- title
properties:
title:
type: string
maxLength: 100
description: 새로운 세션 제목
responses:
'200':
description: 제목 수정 성공
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/AiChatSession'
'404':
description: 세션을 찾을 수 없음
'403':
description: 권한 없음

# ===================
# User Chat Domain APIs
# ===================
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.controller

import com.back.koreaTravelGuide.domain.ai.aiChat.dto.AiChatRequest
import com.back.koreaTravelGuide.domain.ai.aiChat.dto.AiChatResponse
import com.back.koreaTravelGuide.domain.ai.aiChat.dto.SessionMessagesResponse
import com.back.koreaTravelGuide.domain.ai.aiChat.dto.SessionsResponse
import com.back.koreaTravelGuide.domain.ai.aiChat.dto.UpdateSessionTitleRequest
import com.back.koreaTravelGuide.domain.ai.aiChat.dto.UpdateSessionTitleResponse
import com.back.koreaTravelGuide.domain.ai.aiChat.service.AiChatService
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PatchMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api/aichat")
class AiChatController(
private val aiChatService: AiChatService,
) {
@GetMapping("/sessions")
fun getSessions(
@RequestParam userId: Long,
): List<SessionsResponse> {
return aiChatService.getSessions(userId).map {
SessionsResponse(it.id!!, it.sessionTitle)
}
}

@PostMapping("/sessions")
fun createSession(
@RequestParam userId: Long,
): SessionsResponse {
val session = aiChatService.createSession(userId)
return SessionsResponse(session.id!!, session.sessionTitle)
}

@DeleteMapping("/sessions/{sessionId}")
fun deleteSession(
@PathVariable sessionId: Long,
@RequestParam userId: Long,
) {
aiChatService.deleteSession(sessionId, userId)
}

@GetMapping("/sessions/{sessionId}/messages")
fun getSessionMessages(
@PathVariable sessionId: Long,
@RequestParam userId: Long,
): List<SessionMessagesResponse> {
val messages = aiChatService.getSessionMessages(sessionId, userId)
return messages.map {
SessionMessagesResponse(it.content, it.senderType)
}
}

@PostMapping("/sessions/{sessionId}/messages")
fun sendMessage(
@PathVariable sessionId: Long,
@RequestParam userId: Long,
@RequestBody request: AiChatRequest,
): AiChatResponse {
val (userMessage, aiMessage) = aiChatService.sendMessage(sessionId, userId, request.message)
return AiChatResponse(
userMessage = userMessage.content,
aiMessage = aiMessage.content,
)
}

@PatchMapping("/sessions/{sessionId}/title")
fun updateSessionTitle(
@PathVariable sessionId: Long,
@RequestParam userId: Long,
@RequestBody request: UpdateSessionTitleRequest,
): UpdateSessionTitleResponse {
val updatedSession = aiChatService.updateSessionTitle(sessionId, userId, request.newTitle)
return UpdateSessionTitleResponse(
newTitle = updatedSession.sessionTitle,
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class AiChatRequest(
val message: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class AiChatResponse(
val userMessage: String,
val aiMessage: String,
)

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class DeleteAiChatRequest(
val sessionId: Long,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

import com.back.koreaTravelGuide.domain.ai.aiChat.entity.SenderType

data class SessionMessagesResponse(
val content: String,
val senderType: SenderType,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class SessionsResponse(
val sessionId: Long,
val sessionTitle: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class UpdateSessionTitleRequest(
val newTitle: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.dto

data class UpdateSessionTitleResponse(
val newTitle: String,
)
Loading