Skip to content

Commit

Permalink
Merge pull request #48 from SSU-Plector/feat/#47-ai-designer
Browse files Browse the repository at this point in the history
[Feat/#47] ai designer 기능 구현
  • Loading branch information
kangyuri1114 authored Jul 26, 2024
2 parents 36c5e01 + b171494 commit 1f911ec
Show file tree
Hide file tree
Showing 80 changed files with 2,350 additions and 88 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:requestLegacyExternalStorage="true"
android:name=".SSUPlectorApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,39 @@ package com.zucchini.ssuplector.di

import android.content.Context
import android.content.Intent
import com.zucchini.ai_members.designer.AiDesignerActivity
import com.zucchini.ai_members.pm.AiPmActivity
import com.zucchini.auth.LoginActivity
import com.zucchini.common.NavigationProvider
import com.zucchini.projects.MainActivity
import com.zucchini.submit.SubmitDevActivity
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject

class DefaultNavigationProvider @Inject constructor(
@ApplicationContext private val context: Context,
) : NavigationProvider {
class DefaultNavigationProvider
@Inject
constructor(
@ApplicationContext private val context: Context,
) : NavigationProvider {
override fun toDevInfo(): Intent {
TODO("Not yet implemented")
}

override fun toDevInfo(): Intent {
TODO("Not yet implemented")
}
override fun toProjects(): Intent {
TODO("Not yet implemented")
}

override fun toProjects(): Intent {
TODO("Not yet implemented")
}
override fun toMyPage(): Intent {
TODO("Not yet implemented")
}

override fun toMyPage(): Intent {
TODO("Not yet implemented")
}
override fun toLogin(): Intent = Intent(context, LoginActivity::class.java)

override fun toLogin(): Intent {
return Intent(context, LoginActivity::class.java)
}
override fun toSubmitDev(): Intent = Intent(context, SubmitDevActivity::class.java)

override fun toSubmitDev(): Intent {
return Intent(context, SubmitDevActivity::class.java)
}
override fun toMain(): Intent = Intent(context, MainActivity::class.java)

override fun toAiPmMember(): Intent = Intent(context, AiPmActivity::class.java)

override fun toMain(): Intent {
return Intent(context, MainActivity::class.java)
override fun toAiDesignerMembers(): Intent = Intent(context, AiDesignerActivity::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ interface NavigationProvider {
fun toLogin(): Intent
fun toSubmitDev(): Intent
fun toMain(): Intent

fun toAiPmMember(): Intent
fun toAiDesignerMembers(): Intent
}
21 changes: 21 additions & 0 deletions core/network/src/main/java/com/sample/network/di/AiModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sample.network.di

import com.hmh.hamyeonham.common.qualifier.Unsecured
import com.sample.network.service.AiService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.create
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object AiModule {
@Provides
@Singleton
fun provideAiApi(
@Unsecured retrofit: Retrofit,
): AiService = retrofit.create()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sample.network.reponse

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class MeetingProgressResponse(
@SerialName("introduceMyself")
val introduceMyself: Int?,
@SerialName("iceBreaking")
val iceBreaking: Int?,
@SerialName("brainstorming")
val brainstorming: Int?,
@SerialName("topicSelection")
val topicSelection: Int,
@SerialName("progressSharing")
val progressSharing: Int?,
@SerialName("roleDivision")
val roleDivision: Int?,
@SerialName("troubleShooting")
val troubleShooting: Int?,
@SerialName("feedback")
val feedback: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sample.network.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class MeetingProgressRequest(
@SerialName("introduceMyself")
val introduceMyself: Boolean,
@SerialName("iceBreaking")
val iceBreaking: Boolean,
@SerialName("brainstorming")
val brainstorming: Boolean,
@SerialName("topicSelection")
val topicSelection: Boolean,
@SerialName("progressSharing")
val progressSharing: Boolean,
@SerialName("roleDivision")
val roleDivision: Boolean,
@SerialName("troubleShooting")
val troubleShooting: Boolean,
@SerialName("feedback")
val feedback: Boolean,
)
42 changes: 42 additions & 0 deletions core/network/src/main/java/com/sample/network/service/AiService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.sample.network.service

import com.sample.network.model.BaseResponse
import com.sample.network.reponse.LoginResponse
import com.sample.network.reponse.MeetingProgressResponse
import com.sample.network.reponse.RefreshResponse
import com.sample.network.request.MeetingProgressRequest
import okhttp3.MultipartBody
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.Query

interface AiService {

@GET("/api/assistant/pm/meeting")
suspend fun getMeetingProgress(
@Query("pmRequestDTO") setMeetingProgress: MeetingProgressRequest,
@Query("time") time : Int?,
@Query("numberOfParticipants") participants : Int?,
): BaseResponse<MeetingProgressResponse>

@Multipart
@POST("/api/assistant/pm/summary")
suspend fun sendMeetingRecordFile(
@Part file: MultipartBody.Part,
): BaseResponse<String>

@GET("/api/assistant/designer/branding")
suspend fun getBrandingData(
@Query("projectInfo") brandingTextRequest : String?,
): BaseResponse<String>

@GET("/api/assistant/designer/makeImage")
suspend fun getProjectImageData(
@Query("imageInfo") imageTextRequest : String?,
): BaseResponse<String>
}
54 changes: 54 additions & 0 deletions data/src/main/java/com/zucchini/data/AiRepositoryImpl.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.zucchini.data

import com.sample.network.service.AiService
import com.zucchini.domain.model.ai.ProgressMeeting
import com.zucchini.domain.model.ai.ProgressMeetingInfo
import com.zucchini.domain.model.ai.SetProgressMeeting
import com.zucchini.domain.repository.AiRepository
import com.zucchini.mapper.toMeetingProgress
import com.zucchini.mapper.toMeetingProgressRequest
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
import javax.inject.Inject

class AiRepositoryImpl
@Inject
constructor(
private val authService: AiService,
) : AiRepository {
override suspend fun getProgressMeetingData(
setProgressMeeting: SetProgressMeeting?,
progressMeetingInfo: ProgressMeetingInfo,
): Result<ProgressMeeting> =
runCatching {
authService
.getMeetingProgress(
progressMeetingInfo.toMeetingProgressRequest(),
setProgressMeeting?.meetingTime,
setProgressMeeting?.participants,
).data
.toMeetingProgress()
}

override suspend fun sendMeetingRecordFile(recordFile: String): Result<String> {
val recordingFile = File(recordFile)
val requestFile = recordingFile.asRequestBody("audio/*".toMediaTypeOrNull())
val body = MultipartBody.Part.createFormData("file", recordingFile.name, requestFile)

return runCatching {
authService.sendMeetingRecordFile(body).data
}
}

override suspend fun getProjectBranding(projectInfoTextRequest: String?): Result<String> =
runCatching {
authService.getBrandingData(projectInfoTextRequest).data
}

override suspend fun getProjectImage(projectImageRequest: String?): Result<String> =
runCatching {
authService.getProjectImageData(projectImageRequest).data
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.zucchini.data

import com.sample.network.service.DevelopersService
import com.zucchini.domain.model.DevelopersDetailModel
import com.zucchini.domain.model.DevelopersListModel
import com.zucchini.domain.model.SubmitDevInfo
import com.zucchini.domain.model.developers.DevelopersDetailModel
import com.zucchini.domain.model.developers.DevelopersListModel
import com.zucchini.domain.model.submit.SubmitDevInfo
import com.zucchini.domain.repository.DevelopersRepository
import com.zucchini.mapper.toCreateDevelopersRequest
import com.zucchini.mapper.toDevelopersDetailModel
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.zucchini.data

import com.sample.network.service.ProjectsService
import com.zucchini.domain.model.ProjectsDetailModel
import com.zucchini.domain.model.ProjectsListModel
import com.zucchini.domain.model.projects.ProjectsDetailModel
import com.zucchini.domain.model.projects.ProjectsListModel
import com.zucchini.domain.repository.ProjectsRepository
import com.zucchini.mapper.toProjectsDetailModel
import com.zucchini.mapper.toProjectsListModel
Expand Down
17 changes: 17 additions & 0 deletions data/src/main/java/com/zucchini/di/AiBinderModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.zucchini.di

import com.zucchini.data.AiRepositoryImpl
import com.zucchini.domain.repository.AiRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract interface AiBinderModule {
@Binds
@Singleton
abstract fun provideAiRepository(aiRepository: AiRepositoryImpl): AiRepository
}
4 changes: 2 additions & 2 deletions data/src/main/java/com/zucchini/mapper/DevelopersDetail.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.zucchini.mapper

import com.sample.network.reponse.DevelopersDetailResponse
import com.zucchini.domain.model.DevelopersDetailModel
import com.zucchini.domain.model.ProjectInfoInDevDetailModel
import com.zucchini.domain.model.developers.DevelopersDetailModel
import com.zucchini.domain.model.developers.ProjectInfoInDevDetailModel

internal fun DevelopersDetailResponse.toDevelopersDetailModel(): DevelopersDetailModel {
val projectsListInDevelopersDetail = projectsListInDevelopersDetail?.map { developerInfo ->
Expand Down
4 changes: 2 additions & 2 deletions data/src/main/java/com/zucchini/mapper/DevelopersList.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.zucchini.mapper

import com.sample.network.reponse.DevelopersListResponse
import com.zucchini.domain.model.DeveloperDetailInfoInListModel
import com.zucchini.domain.model.DevelopersListModel
import com.zucchini.domain.model.developers.DeveloperDetailInfoInListModel
import com.zucchini.domain.model.developers.DevelopersListModel

internal fun DevelopersListResponse.toDevelopersListModel(): DevelopersListModel {
val developerDetailListInList = developerResponseDTOListInList.map { dto ->
Expand Down
30 changes: 30 additions & 0 deletions data/src/main/java/com/zucchini/mapper/ProgressMeetingMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.zucchini.mapper

import com.sample.network.reponse.MeetingProgressResponse
import com.sample.network.request.MeetingProgressRequest
import com.zucchini.domain.model.ai.ProgressMeeting
import com.zucchini.domain.model.ai.ProgressMeetingInfo

internal fun MeetingProgressResponse.toMeetingProgress(): ProgressMeeting =
ProgressMeeting(
introduceMyself = introduceMyself,
iceBreaking = iceBreaking,
brainstorming = brainstorming,
topicSelection = topicSelection,
progressSharing = progressSharing,
roleDivision = roleDivision,
troubleShooting = troubleShooting,
feedback = feedback,
)

internal fun ProgressMeetingInfo.toMeetingProgressRequest(): MeetingProgressRequest =
MeetingProgressRequest(
introduceMyself = introduceMyself,
iceBreaking = iceBreaking,
brainstorming = brainstorming,
topicSelection = topicSelection,
progressSharing = progressSharing,
roleDivision = roleDivision,
troubleShooting = troubleShooting,
feedback = feedback ,
)
2 changes: 1 addition & 1 deletion data/src/main/java/com/zucchini/mapper/ProjectsDetail.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.zucchini.mapper

import com.sample.network.reponse.ProjectsDetailResponse
import com.zucchini.domain.model.ProjectsDetailModel
import com.zucchini.domain.model.projects.ProjectsDetailModel

internal fun ProjectsDetailResponse.toProjectsDetailModel(): ProjectsDetailModel {
val developerListInProjectDetail = developerList?.map { developerList ->
Expand Down
4 changes: 2 additions & 2 deletions data/src/main/java/com/zucchini/mapper/ProjectsList.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.zucchini.mapper

import com.sample.network.reponse.ProjectsListResponse
import com.zucchini.domain.model.ProjectListInfoInList
import com.zucchini.domain.model.ProjectsListModel
import com.zucchini.domain.model.projects.ProjectListInfoInList
import com.zucchini.domain.model.projects.ProjectsListModel

internal fun ProjectsListResponse.toProjectsListModel(): ProjectsListModel {
val projectListInfoInList = projectResponseDtoList.map { dto ->
Expand Down
2 changes: 1 addition & 1 deletion data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.zucchini.mapper

import com.sample.network.request.CreateDevelopersRequest
import com.zucchini.domain.model.SubmitDevInfo
import com.zucchini.domain.model.submit.SubmitDevInfo

internal fun SubmitDevInfo.toCreateDevelopersRequest(): CreateDevelopersRequest {
return CreateDevelopersRequest(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.zucchini.domain.model.ai

data class ProgressMeeting(
val introduceMyself: Int? = 600000,
val iceBreaking: Int? = 600000,
val brainstorming: Int? = 600000,
val topicSelection: Int? = 600000,
val progressSharing: Int? = 600000,
val roleDivision: Int? = 600000,
val troubleShooting: Int? = 600000,
val feedback: Int? = 600000,
)
Loading

0 comments on commit 1f911ec

Please sign in to comment.