實作ar model新增
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user