Przeglądaj źródła

организации!

kpmy 5 lat temu
rodzic
commit
0f26bf41a2

+ 5 - 0
db/2020-05/views.js

@@ -3,3 +3,8 @@ db.coin.aggregate([
     {$group: {_id: "overall", amount: {$sum: "$coin.amount"}, count: {$sum: 1}}}
 ], {allowDiskUse: true}).saveAsView("coin-overall-view")
 
+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")
+

+ 2 - 0
src/app/src/app/app.module.ts

@@ -35,6 +35,7 @@ import {MatRadioModule} from "@angular/material/radio";
 import {MatCheckboxModule} from "@angular/material/checkbox";
 import {DefaultErrorHandler} from "./misc/DefaultErrorHandler";
 import {PendingIndicator, PendingSnackBar} from "./misc/PendingIndicator";
+import {OrgService} from "./org/org.service";
 
 registerLocaleData(localeRu);
 
@@ -84,6 +85,7 @@ export function jwtTokenGetter() {
     PersonService,
     AccountService,
     BankService,
+    OrgService,
     {provide: ErrorHandler, useClass: DefaultErrorHandler},
     {provide: LOCALE_ID, useValue: "ru-RU"},
     {provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: {duration: 2500}},

+ 28 - 0
src/app/src/app/org/org.service.ts

@@ -0,0 +1,28 @@
+import {Injectable} from "@angular/core";
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs";
+import {map} from "rxjs/operators";
+
+@Injectable({providedIn: "root"})
+export class OrgService {
+
+  constructor(private httpClient: HttpClient) {
+
+  }
+
+  addPrivateToPerson(personId: string): Observable<string> {
+    return this.httpClient.post(`/api/new/private`, {ownerId: personId}).pipe(map((res: any) => <string>res.id))
+  }
+
+  getOrgsInfo(ownerId: string): Observable<OrgInfo[]> {
+    return this.httpClient.get(`/api/old/private/${ownerId}/list`).pipe(map((res: any[]) => res.map(r => {
+      let o = new OrgInfo();
+      o.id = r.id
+      return o;
+    })))
+  }
+}
+
+export class OrgInfo {
+  id: string
+}

+ 18 - 1
src/app/src/app/person/person.page.component.html

@@ -18,7 +18,6 @@
           то, что деньги "вечны". </p>
       </mat-card-content>
       <mat-card-actions>
-        <button (click)="addAccount()" mat-button>ОТКРЫТЬ СЧЁТ</button>
         <button (click)="iNeedMoney()" mat-button>ДАЙ ДЕНЕГ!</button>
       </mat-card-actions>
     </mat-card>
@@ -47,6 +46,9 @@
           </div>
         </div>
       </mat-list-item>
+      <mat-list-item>
+        <button (click)="addAccount()" mat-button>ОТКРЫТЬ СЧЁТ</button>
+      </mat-list-item>
     </mat-list>
   </div>
   <div fxFlex="50" fxLayout="column" fxLayoutGap="0.5em">
@@ -86,5 +88,20 @@
         </div>
       </mat-list-item>
     </mat-list>
+    <mat-toolbar>
+      <mat-toolbar-row>
+        <mat-icon>apartment</mat-icon>&nbsp;Организации
+      </mat-toolbar-row>
+    </mat-toolbar>
+    <mat-list>
+      <mat-list-item *ngFor="let org of orgs">
+        <mat-icon mat-list-icon>business</mat-icon>
+        <div mat-line>Организация</div>
+      </mat-list-item>
+      <mat-list-item>
+        <button (click)="addPrivate()" mat-button>СОЗДАТЬ ОРГАНИЗАЦИЮ</button>
+        <button (click)="joinPrivate()" mat-button>ПРИСОЕДИНИТЬСЯ</button>
+      </mat-list-item>
+    </mat-list>
   </div>
 </div>

+ 11 - 1
src/app/src/app/person/person.page.component.ts

@@ -6,6 +6,7 @@ import * as _ from 'underscore'
 import {BankService, DemurrageInfo} from "../bank/bank.service";
 import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog";
 import {AppComponent} from "../app.component";
+import {OrgInfo, OrgService} from "../org/org.service";
 
 @Component({
   selector: 'person-page',
@@ -16,14 +17,16 @@ export class PersonPageComponent implements OnInit {
 
   accounts: AccountInfo[] = []
   events: AccountEvent[] = []
+  orgs: OrgInfo[] = []
   demurrage: DemurrageInfo
 
-  constructor(private app: AppComponent, private personService: PersonService, private accountService: AccountService, private bankService: BankService, private httpClient: HttpClient, private matDialog: MatDialog) {
+  constructor(private app: AppComponent, private orgService: OrgService, private personService: PersonService, private accountService: AccountService, private bankService: BankService, private httpClient: HttpClient, private matDialog: MatDialog) {
     app.setTitle("ЛИЧНЫЙ КАБИНЕТ")
   }
 
   ngOnInit(): void {
     this.personService.getCurrentPerson().subscribe(person => {
+      this.orgService.getOrgsInfo(person.auth.id).subscribe(orgs => this.orgs = orgs);
       this.accountService.getAccountsInfo(person.auth.id).subscribe(accounts => {
         this.accounts = accounts
         let accountIds = accounts.map(e => e.id)
@@ -57,6 +60,13 @@ export class PersonPageComponent implements OnInit {
     return this.accounts.map(a => a.overall).reduce((total, x) => total + x, 0)
   }
 
+  addPrivate() {
+    this.personService.getCurrentPerson().subscribe(person => this.orgService.addPrivateToPerson(person.auth.id).subscribe(res => this.ngOnInit()))
+  }
+
+  joinPrivate() {
+
+  }
 
   showDebitDialog(account: AccountInfo) {
     this.personService.getCurrentPerson().subscribe(person => {

+ 7 - 0
src/main/java/inn/ocsf/bee/freigeld/core/model/PrivatePerson.java

@@ -1,4 +1,11 @@
 package inn.ocsf.bee.freigeld.core.model;
 
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+
 public interface PrivatePerson extends Person {
+
+    @NotNull
+    UUID getOwnerId();
 }

+ 42 - 0
src/main/java/inn/ocsf/bee/freigeld/core/model/data/PersonData.java

@@ -3,6 +3,7 @@ package inn.ocsf.bee.freigeld.core.model.data;
 import com.querydsl.core.annotations.QueryEntity;
 import inn.ocsf.bee.freigeld.core.model.*;
 import org.bson.types.ObjectId;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.annotation.Version;
 import org.springframework.data.mongodb.core.mapping.Document;
@@ -99,6 +100,41 @@ public class PersonData {
         }
     }
 
+    @QueryEntity
+    public static class PrivatePersonImpl implements PrivatePerson {
+
+        private UUID id;
+
+        private UUID ownerId;
+
+        public PrivatePersonImpl() {
+        }
+
+        public PrivatePersonImpl(@NotNull UUID ownerId) {
+            this.ownerId = ownerId;
+            this.id = UUID.randomUUID();
+        }
+
+        @Override
+        public UUID getId() {
+            return id;
+        }
+
+        public void setId(UUID id) {
+            this.id = id;
+        }
+
+        @NotNull
+        @Override
+        public UUID getOwnerId() {
+            return ownerId;
+        }
+
+        public void setOwnerId(UUID ownerId) {
+            this.ownerId = ownerId;
+        }
+    }
+
     @QueryEntity
     public static class BankPrivate implements PrivatePerson {
 
@@ -115,5 +151,11 @@ public class PersonData {
         public UUID getId() {
             return id;
         }
+
+        @NotNull
+        @Override
+        public UUID getOwnerId() {
+            return UUID.randomUUID();
+        }
     }
 }

+ 12 - 0
src/main/java/inn/ocsf/bee/freigeld/core/model/data/PersonDataPrj0p.java

@@ -0,0 +1,12 @@
+package inn.ocsf.bee.freigeld.core.model.data;
+
+import inn.ocsf.bee.freigeld.core.model.PrivatePerson;
+import org.bson.types.ObjectId;
+
+public interface PersonDataPrj0p {
+
+    ObjectId getId();
+
+    PrivatePerson getPerson();
+
+}

+ 1 - 1
src/main/java/inn/ocsf/bee/freigeld/core/repo/PersonRepository.java

@@ -10,7 +10,7 @@ import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
 
-public interface PersonRepository extends MongoRepository<PersonData, ObjectId>, QuerydslPredicateExecutor<PersonData> {
+public interface PersonRepository extends MongoRepository<PersonData, ObjectId>, QuerydslPredicateExecutor<PersonData>, PersonRepositoryCustom {
 
     Optional<PersonData> findOneByPersonId(UUID person_id);
 

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

@@ -0,0 +1,13 @@
+package inn.ocsf.bee.freigeld.core.repo;
+
+import inn.ocsf.bee.freigeld.core.model.data.PersonDataPrj0p;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.UUID;
+
+public interface PersonRepositoryCustom {
+
+    @NotNull
+    Collection<PersonDataPrj0p> findAllByOwnerId(@NotNull UUID ownerId);
+}

+ 4 - 0
src/main/kotlin/inn/ocsf/bee/freigeld/core/data/CentralBankAccountLevel.kt

@@ -111,6 +111,10 @@ abstract class CentralBankAccountLevel : CentralBank {
         return bankId
     }
 
+    override fun getOwnerId(): UUID {
+        return UUID.randomUUID()
+    }
+
     override fun hasPerson(person: UUID): Boolean {
         return accountRepo.count(Expressions.allOf(bankAccountData.bankId.eq(bankId), bankAccountData.account.ownerId.eq(person))) > 0
     }

+ 1 - 1
src/main/kotlin/inn/ocsf/bee/freigeld/core/data/GlobalWorldImpl.kt

@@ -34,7 +34,7 @@ class GlobalWorldImpl : GlobalWorld {
                 }
                 is PrivatePerson -> {
                     pd.person = person
-                    pd.personType = PersonType.natural
+                    pd.personType = PersonType.privotal
                 }
                 else -> throw RuntimeException("unsupported person type ${person.javaClass.name}")
             }

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

@@ -0,0 +1,43 @@
+package inn.ocsf.bee.freigeld.core.repo
+
+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 java.util.*
+import javax.inject.Inject
+import kotlin.collections.HashMap
+
+class PersonRepositoryImpl : PersonRepositoryCustom {
+
+    @Inject
+    private lateinit var mongo: MongoOperations
+
+    override fun findAllByOwnerId(ownerId: UUID): Collection<PersonDataPrj0p> {
+        return mongo.find(Query.query(Criteria.where("_id.ownerId").`is`(ownerId)), HashMap::class.java, "person-owner-view").map {
+            val id = (it.get("_id") as Map<String, Any>?) ?: mapOf()
+            val ret = object : PersonDataPrj0p {
+
+                override fun getId(): ObjectId {
+                    return id.get("_id") as ObjectId
+                }
+
+                override fun getPerson(): PrivatePerson {
+                    val fake = object : PrivatePerson {
+                        override fun getOwnerId(): UUID {
+                            return id.get("ownerId") as UUID
+                        }
+
+                        override fun getId(): UUID {
+                            return id.get("personId") as UUID
+                        }
+                    }
+                    return fake
+                }
+            }
+            ret
+        }.toMutableList()
+    }
+}

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

@@ -0,0 +1,18 @@
+package inn.ocsf.bee.freigeld.core.service
+
+import inn.ocsf.bee.freigeld.core.repo.PersonRepository
+import org.springframework.stereotype.Service
+import java.util.*
+import javax.inject.Inject
+
+@Service
+class WorldService {
+
+    @Inject
+    private lateinit var personRepo: PersonRepository
+
+    fun findAllByOwnerId(ownerId: UUID): Set<UUID> {
+        return personRepo.findAllByOwnerId(ownerId).map { it.person }.map { it.id }.toSet()
+    }
+
+}

+ 42 - 0
src/main/kotlin/inn/ocsf/bee/freigeld/serve/rest/OrgController.kt

@@ -0,0 +1,42 @@
+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.data.PersonData
+import inn.ocsf.bee.freigeld.core.service.WorldService
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+import java.util.*
+import javax.inject.Inject
+
+@RestController
+class OrgController {
+
+    @Inject
+    private lateinit var world: GlobalWorld
+
+    @Inject
+    private lateinit var worldService: WorldService
+
+    @Inject
+    private lateinit var bank: CentralBank
+
+    @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 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)
+        })
+    }
+}
+
+data class PrivatePersonInfo(val id: UUID)
+
+data class NewPrivatePersonReq(val ownerId: UUID)