瀏覽代碼

организациями теперь можно не только владеть, но и числиться в них

κρμγ 5 年之前
父節點
當前提交
35fafd0baa

+ 21 - 2
db/2020-05/views.js

@@ -1,10 +1,29 @@
 db.coin.aggregate([
     {$match: {status: 'indoor'}},
     {$group: {_id: "overall", amount: {$sum: "$coin.amount"}, count: {$sum: 1}}}
-], {allowDiskUse: true}).saveAsView("coin-overall-view")
+], {allowDiskUse: true}).saveAsView("coin-overall-view", {dropIfExists: false})
 
 db.person.aggregate([
     {$match: {personType: 'privotal', "person.ownerId": {$exists: true}}},
     {$group: {_id: {_id: "$_id", personId: "$person._id", ownerId: "$person.ownerId"}}}
-], {allowDiskUse: true}).saveAsView("person-owner-view")
+], {allowDiskUse: true}).saveAsView("person-owner-view", {dropIfExists: false})
 
+db.person.aggregate([
+    {$match: {personType: 'privotal'}},
+    {$unwind: "$identitySet"},
+    {$addFields: {"_identities": {$objectToArray: "$identities"}}},
+    {
+        $addFields: {
+            "_firstIdentity": {
+                $filter: {
+                    input: "$_identities",
+                    as: "it1",
+                    cond: {$eq: ["$$it1.k", "$identitySet"]}
+                }
+            }
+        }
+    },
+    {$unwind: "$_firstIdentity"},
+    {$match: {"_firstIdentity.v._class": /PersonIdentityPrivateMember/}},
+    {$group: {_id: {personId: "$person._id", memberId: "$_firstIdentity.v.personId", position: "$_firstIdentity.v.position"}}}
+], {allowDiskUse: true}).saveAsView("person-member-view", {dropIfExists: false})

+ 5 - 0
pom.xml

@@ -187,6 +187,11 @@
             <version>0.11.1</version>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <version>2.11.7</version>
+        </dependency>
 
     </dependencies>
 

+ 5 - 0
src/main/java/inn/ocsf/bee/freigeld/core/repo/PersonRepositoryCustom.java

@@ -1,7 +1,9 @@
 package inn.ocsf.bee.freigeld.core.repo;
 
+import inn.ocsf.bee.freigeld.core.model.PersonMemberPosition;
 import inn.ocsf.bee.freigeld.core.model.data.PersonDataPrj0p;
 import org.jetbrains.annotations.NotNull;
+import scala.Tuple2;
 
 import java.util.Collection;
 import java.util.UUID;
@@ -10,4 +12,7 @@ public interface PersonRepositoryCustom {
 
     @NotNull
     Collection<PersonDataPrj0p> findAllByOwnerId(@NotNull UUID ownerId);
+
+    @NotNull
+    Collection<Tuple2<UUID, PersonMemberPosition>> findAllByMemberId(@NotNull UUID memberId);
 }

+ 12 - 0
src/main/kotlin/inn/ocsf/bee/freigeld/core/model/PersonIdentityTypes.kt

@@ -1,6 +1,18 @@
 package inn.ocsf.bee.freigeld.core.model
 
 import org.apache.commons.codec.digest.DigestUtils
+import java.util.*
+
+data class PersonIdentityPrivateMember(val personId: UUID, val position: PersonMemberPosition) : PersonIdentity {
+
+    override fun getKey(): String {
+        return "${personId}/${position}"
+    }
+}
+
+enum class PersonMemberPosition {
+    owner, coowner, unit
+}
 
 data class PersonIdentityFullName(val fullName: String) : PersonIdentity {
 

+ 11 - 0
src/main/kotlin/inn/ocsf/bee/freigeld/core/repo/PersonRepositoryImpl.kt

@@ -1,11 +1,13 @@
 package inn.ocsf.bee.freigeld.core.repo
 
+import inn.ocsf.bee.freigeld.core.model.PersonMemberPosition
 import inn.ocsf.bee.freigeld.core.model.PrivatePerson
 import inn.ocsf.bee.freigeld.core.model.data.PersonDataPrj0p
 import org.bson.types.ObjectId
 import org.springframework.data.mongodb.core.MongoOperations
 import org.springframework.data.mongodb.core.query.Criteria
 import org.springframework.data.mongodb.core.query.Query
+import scala.Tuple2
 import java.util.*
 import javax.inject.Inject
 import kotlin.collections.HashMap
@@ -40,4 +42,13 @@ class PersonRepositoryImpl : PersonRepositoryCustom {
             ret
         }.toMutableList()
     }
+
+    override fun findAllByMemberId(memberId: UUID): Collection<Tuple2<UUID, PersonMemberPosition>> {
+        return mongo.find(Query.query(Criteria.where("_id.memberId").`is`(memberId)), HashMap::class.java, "person-member-view").map {
+            val id = (it.get("_id") as Map<String, Any>?) ?: mapOf()
+            val position = PersonMemberPosition.valueOf(id.get("position") as String)
+            val personId = id.get("personId") as UUID
+            Tuple2(personId, position)
+        }
+    }
 }

+ 6 - 0
src/main/kotlin/inn/ocsf/bee/freigeld/core/service/WorldService.kt

@@ -1,7 +1,9 @@
 package inn.ocsf.bee.freigeld.core.service
 
+import inn.ocsf.bee.freigeld.core.model.PersonMemberPosition
 import inn.ocsf.bee.freigeld.core.repo.PersonRepository
 import org.springframework.stereotype.Service
+import scala.Tuple2
 import java.util.*
 import javax.inject.Inject
 
@@ -15,4 +17,8 @@ class WorldService {
         return personRepo.findAllByOwnerId(ownerId).map { it.person }.map { it.id }.toSet()
     }
 
+    fun findAllByMemberId(memberId: UUID): List<Tuple2<UUID, PersonMemberPosition>> {
+        return personRepo.findAllByMemberId(memberId).toList()
+    }
+
 }

+ 12 - 5
src/main/kotlin/inn/ocsf/bee/freigeld/serve/rest/OrgController.kt

@@ -2,6 +2,8 @@ package inn.ocsf.bee.freigeld.serve.rest
 
 import inn.ocsf.bee.freigeld.core.model.CentralBank
 import inn.ocsf.bee.freigeld.core.model.GlobalWorld
+import inn.ocsf.bee.freigeld.core.model.PersonIdentityPrivateMember
+import inn.ocsf.bee.freigeld.core.model.PersonMemberPosition
 import inn.ocsf.bee.freigeld.core.model.data.PersonData
 import inn.ocsf.bee.freigeld.core.service.WorldService
 import org.springframework.http.ResponseEntity
@@ -24,19 +26,24 @@ class OrgController {
     @RequestMapping("api/new/private", method = [RequestMethod.POST])
     fun new(@RequestBody newReq: NewPrivatePersonReq): ResponseEntity<Map<String, Any?>> {
         val orgId = world.addPerson(PersonData.PrivatePersonImpl(newReq.ownerId))
+        val org = world.getPerson(orgId) ?: throw RuntimeException("org not created")
+        world.setPersonIdentity(org, PersonIdentityPrivateMember(newReq.ownerId, PersonMemberPosition.owner))
         val orgAccount = bank.addAccount(orgId)
         return ResponseEntity.ok(mapOf("id" to orgId, "accountId" to orgAccount.id))
     }
 
     @RequestMapping("api/old/private/{ownerId}/list", method = [RequestMethod.GET])
     fun list(@PathVariable("ownerId") ownerId: UUID): ResponseEntity<List<PrivatePersonInfo>> {
-        return ResponseEntity.ok(worldService.findAllByOwnerId(ownerId).map {
-            val org = world.getPerson(it)
-            PrivatePersonInfo(it)
-        })
+        val ret = (worldService.findAllByOwnerId(ownerId).map {
+            //val org = world.getPerson(it)
+            PrivatePersonInfo(it, PersonMemberPosition.owner)
+        } + worldService.findAllByMemberId(ownerId).map {
+            PrivatePersonInfo(it._1, it._2)
+        }).distinctBy { it.id }
+        return ResponseEntity.ok(ret)
     }
 }
 
-data class PrivatePersonInfo(val id: UUID)
+data class PrivatePersonInfo(val id: UUID, val position: PersonMemberPosition)
 
 data class NewPrivatePersonReq(val ownerId: UUID)