實作ar model新增

This commit is contained in:
Raymond Yang
2023-05-16 14:53:35 +08:00
parent bd214f0423
commit d787932e45
18 changed files with 1356 additions and 0 deletions
@@ -3,6 +3,7 @@ package com.ray650128
import com.ray650128.model.pojo.User
import com.ray650128.plugins.configureUserRouting
import com.ray650128.plugins.configureArMaterialRouting
import com.ray650128.plugins.configureArModelRouting
import com.ray650128.service.UserService
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.application.*
@@ -38,5 +39,6 @@ fun main() {
}
configureUserRouting()
configureArMaterialRouting()
configureArModelRouting()
}.start(wait = true)
}
@@ -0,0 +1,32 @@
package com.ray650128.extension
import com.ray650128.model.pojo.arModel.ArModel
import com.ray650128.model.pojo.arModelDto.ArModelDto
fun ArModel.toDto(): ArModelDto =
ArModelDto(
_id = this._id.toString(),
ownerId = this.ownerId.toString(),
name = this.name,
position = this.position,
rotation = this.rotation,
scale = this.scale,
modelData = this.modelData.toDto(),
events = this.events,
childEvents = this.childEvents,
createAt = this.createAt,
updatedAt = this.updatedAt
)
fun ArModelDto.toArModel(): ArModel =
ArModel(
name = this.name,
position = this.position,
rotation = this.rotation,
scale = this.scale,
modelData = this.modelData.toModelData(),
events = this.events,
childEvents = this.childEvents,
createAt = this.createAt,
updatedAt = this.updatedAt
)
@@ -0,0 +1,22 @@
package com.ray650128.extension
import com.ray650128.model.pojo.arModel.ModelData
import com.ray650128.model.pojo.arModelDto.ModelDataDto
import com.ray650128.service.MaterialService
fun ModelData.toDto(): ModelDataDto {
val service = MaterialService()
return ModelDataDto(
type = this.type,
material = service.findById(this.material.toString()),
params = this.params
)
}
fun ModelDataDto.toModelData(): ModelData =
ModelData(
type = this.type,
material = this.material?._id,
params = this.params
)
@@ -0,0 +1,22 @@
package com.ray650128.model.pojo.arModel
import com.ray650128.model.pojo.User
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import org.litote.kmongo.Id
import org.litote.kmongo.newId
@Serializable
data class ArModel(
@Contextual var _id: Id<ArModel>? = newId(),
@Contextual var ownerId: Id<User>? = null,
var name: String,
var position: Float3,
var rotation: Float3,
var scale: Float3,
var modelData: ModelData,
var events: ArrayList<ModelEvent>? = null,
var childEvents: HashMap<String, ArrayList<ModelEvent>?>? = null,
var createAt: Long? = null,
var updatedAt: Long? = null
)
@@ -0,0 +1,11 @@
package com.ray650128.model.pojo.arModel
import kotlinx.serialization.Serializable
@Serializable
data class Color(
var r: Float = 0.0f,
var g: Float = 0.0f,
var b: Float = 0.0f,
var a: Float = 0.0f
)
@@ -0,0 +1,10 @@
package com.ray650128.model.pojo.arModel
import kotlinx.serialization.Serializable
@Serializable
data class Float3(
var x: Float,
var y: Float,
var z: Float
)
@@ -0,0 +1,44 @@
package com.ray650128.model.pojo.arModel
import kotlinx.serialization.Serializable
@Serializable
data class ModelAction(
var actionType: Int,
var duration: Float?,
var translation: Float3? = null,
var rotation: Float3? = null,
var scale: Float3? = null,
var alpha: Float? = null,
var webUrl: String? = null,
var speed: Float? = null,
var startFrame: Float? = null,
var endFrame: Float? = null,
var fps: Float? = null,
var repeatCount: Int? = null,
var squareMoveWidth: Float? = null,
var squareMoveHeight: Float? = null,
var squareMoveTime: Float? = null,
var squareMoveRotationTime: Float? = null,
var clockwise: Boolean? = null,
var roundMoveRadius: Float? = null,
var roundMoveStartAngle: Float? = null,
var roundMoveEndAngel: Float? = null,
var resolution: Float? = null,
var moveToFaceDistance: Float? = null,
var isAutoReturn: Boolean? = null,
var autoReturnDelay: Float? = null,
var isFaceToMe: Boolean? = null,
var vibrationTime: Int? = null,
var targetId: Int? = null,
var groupNumber: Int? = null
)
@@ -0,0 +1,13 @@
package com.ray650128.model.pojo.arModel
import com.ray650128.model.pojo.Material
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import org.litote.kmongo.Id
@Serializable
data class ModelData(
var type: Int = -1,
@Contextual var material: Id<Material>? = null,
var params: ModelParams
)
@@ -0,0 +1,9 @@
package com.ray650128.model.pojo.arModel
import kotlinx.serialization.Serializable
@Serializable
data class ModelEvent(
var eventType: Int,
var actions: ArrayList<ModelAction>? = null
)
@@ -0,0 +1,51 @@
package com.ray650128.model.pojo.arModel
import kotlinx.serialization.Serializable
@Serializable
data class ModelParams(
var isFaceMe: Boolean = false,
var isIgnore: Boolean = false,
var isHidden: Boolean = false,
var isDoubleSided: Boolean = true,
var isOcclusion: Boolean = false,
var availableRange: Float = 20f,
var width: Float? = null,
var height: Float? = null,
var depth: Float? = null,
var radius: Float? = null,
var isSizeScaleLock: Boolean? = null,
var modelAnimSpeed: Float? = null,
var modelStartFrame: Float? = null,
var modelEndFrame: Float? = null,
var modelFPS: Float? = null,
var multiplyNumber: Int? = null,
var multiplyRadius: Float? = null,
var multiplyRange: Float? = null,
var isMultiplyPlane: Boolean? = null,
var hueAngle: Float? = null,
var hueRange: Float? = null,
var saturation: Float? = null,
var isPlayWhenReady: Boolean? = null,
var isRepeat: Boolean? = null,
var videoThumbnail: String? = null,
var lightIntensity: Float? = null,
var color: Color? = null,
var levelCount: Int? = null,
var levelBorders: ArrayList<Float>? = null,
var levelAngles: ArrayList<Float>? = null,
var planeCount: Int? = null,
var planeBorder: Float? = null,
var speed: Float? = null,
var isClockwise: Boolean? = null,
var signIcon: String? = null,
var signName: String? = null,
var signTextColor: Color? = null
)
@@ -0,0 +1,20 @@
package com.ray650128.model.pojo.arModelDto
import com.ray650128.model.pojo.arModel.Float3
import com.ray650128.model.pojo.arModel.ModelEvent
import kotlinx.serialization.Serializable
@Serializable
data class ArModelDto(
var _id: String? = null,
var ownerId: String? = null,
var name: String,
var position: Float3,
var rotation: Float3,
var scale: Float3,
var modelData: ModelDataDto,
var events: ArrayList<ModelEvent>? = null,
var childEvents: HashMap<String, ArrayList<ModelEvent>?>? = null,
var createAt: Long? = null,
var updatedAt: Long? = null
)
@@ -0,0 +1,14 @@
package com.ray650128.model.pojo.arModelDto
import com.ray650128.model.pojo.Material
import com.ray650128.model.pojo.arModel.ModelParams
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import org.litote.kmongo.Id
@Serializable
data class ModelDataDto(
var type: Int = -1,
var material: Material? = null,
var params: ModelParams
)
@@ -0,0 +1,89 @@
package com.ray650128.plugins
import com.ray650128.extension.*
import com.ray650128.model.ErrorResponse
import com.ray650128.model.pojo.arModel.ArModel
import com.ray650128.model.pojo.User
import com.ray650128.service.ModelService
import com.ray650128.service.UserService
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
fun Application.configureArModelRouting() {
val userService = UserService()
val modelService = ModelService()
routing {
route("/api") {
route("/v1") {
authenticate {
route("/models") {
get {
val account = call.authentication.principal<User>()?.account ?: run {
call.sendUnauthorized()
return@get
}
val user = userService.findByAccount(account) ?: run {
call.sendUnauthorized()
return@get
}
val list = modelService.findByOwnerId(user._id.toString()).map(ArModel::toDto)
call.sendSuccess(list)
}
post("/create") {
val user = call.authentication.principal<User>() ?: run {
call.sendUnauthorized()
return@post
}
val body = call.receive<ArModel>()
body.apply {
ownerId = user._id
createAt = System.currentTimeMillis()
}
val modelId = modelService.create(body)
if (modelId != null) {
val data = modelService.findById(modelId.toString())?.toDto()
call.sendSuccess(data)
} else {
call.sendBadRequest(ErrorResponse("Add ar model fail."))
}
}
put("/{id}") {
call.authentication.principal<User>()?.account ?: run {
call.sendUnauthorized()
return@put
}
val body = call.receive<ArModel>()
val id = call.parameters["id"].toString()
val model = modelService.findById(id) ?: run {
call.sendNotFound()
return@put
}
body.apply {
ownerId = model.ownerId
createAt = model.createAt
}
val isSuccess = modelService.updateById(id, body)
call.sendSuccess(mapOf("success" to isSuccess))
}
delete("/{id}") {
call.authentication.principal<User>()?.account ?: run {
call.sendUnauthorized()
return@delete
}
val id = call.parameters["id"].toString()
val isSuccess = modelService.deleteById(id)
call.sendSuccess(mapOf("success" to isSuccess))
}
}
}
}
}
}
}
@@ -0,0 +1,51 @@
package com.ray650128.service
import com.ray650128.model.pojo.arModel.ArModel
import com.ray650128.model.pojo.User
import org.bson.types.ObjectId
import org.litote.kmongo.*
import org.litote.kmongo.id.toId
class ModelService {
private val client = KMongo.createClient("mongodb://www.ray650128.com:27017")
private val database = client.getDatabase("ar_system")
private val arModelCollection = database.getCollection<ArModel>()
fun create(arModel: ArModel): Id<ArModel>? {
arModelCollection.insertOne(arModel)
return arModel._id
}
fun findAll(): List<ArModel> = arModelCollection.find().toList()
fun findById(id: String): ArModel? {
val bsonId: Id<ArModel> = ObjectId(id).toId()
return arModelCollection.findOne(ArModel::_id eq bsonId)
}
fun findByOwnerId(ownerId: String): List<ArModel> {
val bsonId: Id<User> = ObjectId(ownerId).toId()
return arModelCollection.find(ArModel::ownerId eq bsonId).toList()
}
fun findByName(name: String): List<ArModel> {
val caseSensitiveTypeSafeFilter = ArModel::name regex name
return arModelCollection.find(caseSensitiveTypeSafeFilter).toList()
}
fun updateById(id: String, request: ArModel): Boolean =
findById(id)?.let { arModel ->
val updateResult = arModelCollection.replaceOne(
arModel.copy(
name = request.name,
updatedAt = request.updatedAt
)
)
updateResult.modifiedCount == 1L
} ?: false
fun deleteById(id: String): Boolean {
val deleteResult = arModelCollection.deleteOneById(ObjectId(id))
return deleteResult.deletedCount == 1L
}
}