Sfoglia il codice sorgente

отладил вебсокеты + страница организаций

kpmy 5 anni fa
parent
commit
a612e2195f

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

@@ -4,12 +4,14 @@ import {AppLoginComponent} from "./app.login.component";
 import {AppIndexComponent} from "./app.index.component";
 import {PersonPageComponent} from "./person/person.page.component";
 import {PersonService} from "./person/person.service";
+import {PrivotalPageComponent} from "./org/privotal.page.component";
 
 
 const routes: Routes = [
   {path: 'frei', component: AppIndexComponent},
   {path: 'login', component: AppLoginComponent},
   {path: 'personal', component: PersonPageComponent, canActivate: [PersonService], canActivateChild: [PersonService]},
+  {path: 'privotal', component: PrivotalPageComponent, canActivate: [PersonService], canActivateChild: [PersonService]},
   {path: '', redirectTo: 'frei', pathMatch: 'full'},
 ];
 

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

@@ -37,6 +37,7 @@ import {DefaultErrorHandler} from "./misc/DefaultErrorHandler";
 import {PendingIndicator, PendingSnackBar} from "./misc/PendingIndicator";
 import {OrgService} from "./org/org.service";
 import {RxStompService} from "@stomp/ng2-stompjs";
+import {PrivotalPageComponent} from "./org/privotal.page.component";
 
 registerLocaleData(localeRu);
 
@@ -46,7 +47,7 @@ export function jwtTokenGetter() {
 
 @NgModule({
   declarations: [
-    AppComponent, AppLoginComponent, AppIndexComponent, PersonPageComponent, PersonDebitDialogComponent, PendingSnackBar, PersonCreditDialogComponent
+    AppComponent, AppLoginComponent, AppIndexComponent, PersonPageComponent, PersonDebitDialogComponent, PendingSnackBar, PersonCreditDialogComponent, PrivotalPageComponent
   ],
   entryComponents: [
     PersonDebitDialogComponent, PendingSnackBar, PersonCreditDialogComponent

+ 3 - 0
src/app/src/app/bank/account/account.service.ts

@@ -30,6 +30,9 @@ export class AccountService {
         case "ExchangeSuccessEvent":
           ev.info = e.info.parentEvent
           break;
+        case "ExchangeFailedEvent":
+          ev.info = e.info.parentEvent
+          break;
         default:
           throw new Error(`unknown event ${e.type}`)
       }

+ 6 - 5
src/app/src/app/org/org.service.ts

@@ -10,19 +10,20 @@ export class OrgService {
 
   }
 
+  getOrg(privateId: string, memberId: string): Observable<OrgInfo> {
+    return this.httpClient.get(`/api/old/private/${privateId}`, {params: {'memberId': memberId}}).pipe(map(r => <OrgInfo>r))
+  }
+
   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;
-    })))
+    return this.httpClient.get(`/api/old/private/${ownerId}/list`).pipe(map((res: any[]) => res.map(r => <OrgInfo>r)))
   }
 }
 
 export class OrgInfo {
   id: string
+  position: string
 }

+ 1 - 0
src/app/src/app/org/privotal.page.component.html

@@ -0,0 +1 @@
+asdfasd

+ 0 - 0
src/app/src/app/org/privotal.page.component.scss


+ 33 - 0
src/app/src/app/org/privotal.page.component.ts

@@ -0,0 +1,33 @@
+import {AfterViewInit, Component, OnDestroy, OnInit} from "@angular/core";
+import {ActivatedRoute} from "@angular/router";
+import {OrgService} from "./org.service";
+import {PersonService} from "../person/person.service";
+import {AppComponent} from "../app.component";
+
+@Component({
+  selector: 'private-page',
+  templateUrl: 'privotal.page.component.html',
+  styleUrls: ['privotal.page.component.scss']
+})
+export class PrivotalPageComponent implements OnInit, OnDestroy, AfterViewInit {
+
+  constructor(private app: AppComponent, private route: ActivatedRoute, private orgService: OrgService, private personService: PersonService) {
+    route.paramMap.subscribe(par => personService.getCurrentPerson().subscribe(person => orgService.getOrg(par.get("privateId"), person.auth.id).subscribe(org => {
+
+    })))
+    app.setTitle("КАБИНЕТ ОРГАНИЗАЦИИ")
+  }
+
+  ngAfterViewInit(): void {
+
+  }
+
+  ngOnDestroy(): void {
+
+  }
+
+  ngOnInit(): void {
+
+  }
+
+}

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

@@ -94,9 +94,10 @@
       </mat-toolbar-row>
     </mat-toolbar>
     <mat-list>
-      <mat-list-item *ngFor="let org of orgs">
+      <mat-list-item *ngFor="let org of orgs" [routerLink]="['/privotal', {privateId: org.id}]" class="href">
         <mat-icon mat-list-icon>business</mat-icon>
         <div mat-line>Организация</div>
+        <div mat-line>{{org.position}}</div>
       </mat-list-item>
       <mat-list-item>
         <button (click)="addPrivate()" mat-button>СОЗДАТЬ ОРГАНИЗАЦИЮ</button>

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

@@ -32,9 +32,7 @@ export class PersonPageComponent implements OnInit, OnDestroy {
   }
 
   ngOnInit(): void {
-    this.eventBus = this.rxStompService.watch("/bus/exchange").subscribe(msg => {
-
-    })
+    this.eventBus = this.rxStompService.watch(`/user/topic/exchange`).subscribe(msg => this.updateNow())
     this.updateNow()
   }
 

+ 5 - 4
src/app/src/app/person/person.service.ts

@@ -21,7 +21,7 @@ export class PersonService implements CanActivate, CanActivateChild {
     }
     let tk = this.getCurrentToken()
     if (tk != null) {
-      this.startStomp(tk.rawToken);
+      this.startStomp(tk);
     }
   }
 
@@ -38,8 +38,8 @@ export class PersonService implements CanActivate, CanActivateChild {
     this.currentPerson = null;
   }
 
-  startStomp(token: string) {
-    const config: InjectableRxStompConfig = {...myRxStompConfig, connectHeaders: {"passcode": token}};
+  startStomp(token: any) {
+    const config: InjectableRxStompConfig = {...myRxStompConfig, connectHeaders: {"login": token.sub, "passcode": token.rawToken}};
     this.rxStompService.configure(config);
     this.rxStompService.activate();
   }
@@ -47,7 +47,8 @@ export class PersonService implements CanActivate, CanActivateChild {
   setCurrentPerson(token: string) {
     this.resetCurrentPerson();
     localStorage.setItem("token", token);
-    this.startStomp(token);
+    let tk = this.getCurrentToken()
+    this.startStomp(tk);
   }
 
   getCurrentToken(): any {

+ 3 - 2
src/main/kotlin/inn/ocsf/bee/freigeld/core/data/CentralBankQueueLevel.kt

@@ -23,7 +23,7 @@ class CentralBankQueueLevel : CentralBankAccountLevel() {
 
     companion object {
         val bankTicketChannelName = Bank::class.java.name
-        val bankExchangeBusName = "/bus/exchange"
+        val bankExchangeBusName = "/topic/exchange"
     }
 
     @Autowired
@@ -47,7 +47,8 @@ class CentralBankQueueLevel : CentralBankAccountLevel() {
             val def = CompletableDeferred<Ticket>()
             def.invokeOnCompletion { t: Throwable? ->
                 if (t == null) {
-                    messaging.convertAndSend(bankExchangeBusName, e.id.toString())
+                    messaging.convertAndSendToUser(to.ownerId.toString(), bankExchangeBusName, e.id.toString())
+                    messaging.convertAndSendToUser(from.ownerId.toString(), bankExchangeBusName, e.id.toString())
                     ret.complete(e)
                 } else {
                     ret.completeExceptionally(t)

+ 1 - 1
src/main/kotlin/inn/ocsf/bee/freigeld/serve/WebSocket.kt

@@ -28,7 +28,7 @@ class WebSocket : WebSocketMessageBrokerConfigurer {
     private lateinit var jwtUserDetailsService: JwtUserDetailsService
 
     override fun configureMessageBroker(registry: MessageBrokerRegistry) {
-        registry.enableSimpleBroker("/bus")
+        registry.enableSimpleBroker("/topic")
         registry.setApplicationDestinationPrefixes("/app")
         registry.setUserDestinationPrefix("/user")
     }

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

@@ -6,6 +6,7 @@ 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.HttpStatus
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
 import java.util.*
@@ -42,6 +43,22 @@ class OrgController {
         }).distinctBy { it.id }
         return ResponseEntity.ok(ret)
     }
+
+    @RequestMapping("api/old/private/{privateId}", method = [RequestMethod.GET])
+    fun old(@PathVariable("privateId") privateId: UUID, @RequestParam("memberId") memberId: UUID): ResponseEntity<PrivatePersonInfo> {
+        val org = world.getPerson(privateId)
+        return if (org != null) {
+            val accessors = world.getPersonIdentitySet(org) ?: setOf()
+            val ret = accessors.filter { it is PersonIdentityPrivateMember }.map { it as PersonIdentityPrivateMember }.filter { it.personId == memberId }.map { PrivatePersonInfo(it.personId, it.position) }.firstOrNull()
+            if (ret != null) {
+                ResponseEntity.ok(ret)
+            } else {
+                ResponseEntity(HttpStatus.FORBIDDEN)
+            }
+        } else {
+            ResponseEntity(HttpStatus.NOT_FOUND)
+        }
+    }
 }
 
 data class PrivatePersonInfo(val id: UUID, val position: PersonMemberPosition)