From 1981cfbf4584136ad4814a318ae2a500088cd4a8 Mon Sep 17 00:00:00 2001 From: Pishang Ujeniya Date: Wed, 23 Nov 2022 09:15:34 +0530 Subject: [PATCH] Added Error Response Handling fixed #9 --- src/KiteHelper/ClientApp/package-lock.json | 4 +- src/KiteHelper/ClientApp/package.json | 2 +- .../components/header/header.component.ts | 14 +- .../src/app/account/account.module.ts | 3 + .../src/app/account/login/login.component.ts | 14 +- .../app/dashboard/dashboard-routing.module.ts | 2 +- .../src/app/dashboard/dashboard.module.ts | 3 +- .../download-historical-data.component.ts | 14 +- .../historical-data.component.ts | 11 +- .../dashboard/historical/historical.module.ts | 2 +- .../error-dialog/error-dialog.component.css | 0 .../error-dialog/error-dialog.component.html | 28 ++++ .../error-dialog/error-dialog.component.ts | 23 ++++ .../shared/not-found/not-found.component.html | 0 .../shared/not-found/not-found.component.scss | 0 .../shared/not-found/not-found.component.ts | 0 .../{dashboard => }/shared/shared.module.ts | 6 +- .../trading-symbol.component.html | 0 .../trading-symbol.component.scss | 2 +- .../trading-symbol.component.ts | 0 src/KiteHelper/Controllers/KiteController.cs | 120 ++++++++++++------ src/KiteHelper/Helpers/CommonExtensions.cs | 36 ++++++ 22 files changed, 231 insertions(+), 53 deletions(-) create mode 100644 src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.css create mode 100644 src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.html create mode 100644 src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.ts rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/not-found/not-found.component.html (100%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/not-found/not-found.component.scss (100%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/not-found/not-found.component.ts (100%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/shared.module.ts (61%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/trading-symbol/trading-symbol.component.html (100%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/trading-symbol/trading-symbol.component.scss (92%) rename src/KiteHelper/ClientApp/src/app/{dashboard => }/shared/trading-symbol/trading-symbol.component.ts (100%) create mode 100644 src/KiteHelper/Helpers/CommonExtensions.cs diff --git a/src/KiteHelper/ClientApp/package-lock.json b/src/KiteHelper/ClientApp/package-lock.json index 0b2c280..6d65bf5 100644 --- a/src/KiteHelper/ClientApp/package-lock.json +++ b/src/KiteHelper/ClientApp/package-lock.json @@ -1,12 +1,12 @@ { "name": "kitehelper", - "version": "2.0.0", + "version": "1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "kitehelper", - "version": "2.0.0", + "version": "1.1", "hasInstallScript": true, "dependencies": { "@angular/animations": "^14.1.0", diff --git a/src/KiteHelper/ClientApp/package.json b/src/KiteHelper/ClientApp/package.json index 6b6b7b3..ab24991 100644 --- a/src/KiteHelper/ClientApp/package.json +++ b/src/KiteHelper/ClientApp/package.json @@ -1,6 +1,6 @@ { "name": "kitehelper", - "version": "1.0", + "version": "1.1", "scripts": { "postinstall": "ngcc --properties es2015 es5 browser module main --first-only --create-ivy-entry-points", "install:packages": "npm install --legacy-peer-deps --location=project", diff --git a/src/KiteHelper/ClientApp/src/app/@theme/components/header/header.component.ts b/src/KiteHelper/ClientApp/src/app/@theme/components/header/header.component.ts index 0a78408..5a74bda 100644 --- a/src/KiteHelper/ClientApp/src/app/@theme/components/header/header.component.ts +++ b/src/KiteHelper/ClientApp/src/app/@theme/components/header/header.component.ts @@ -1,10 +1,11 @@ import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; import { Component, OnDestroy, OnInit } from '@angular/core'; -import { NbMenuService, NbSidebarService, NbToastrService } from '@nebular/theme'; +import { NbDialogService, NbMenuService, NbSidebarService, NbToastrService } from '@nebular/theme'; import { Subject } from 'rxjs'; import { KiteApiService, ProfileResponseModel } from 'src/app/services/api/kite-api.service'; import { RoutingHelperService } from 'src/app/services/routing-helper.service'; +import { ErrorDialogComponent } from 'src/app/shared/error-dialog/error-dialog.component'; import { environment } from 'src/environments/environment'; @Component({ @@ -34,6 +35,7 @@ export class HeaderComponent implements OnInit, OnDestroy { private hamburgerService: NbMenuService, private toastrService: NbToastrService, private kiteApiService: KiteApiService, + private dialogService: NbDialogService, ) { } ngOnInit() { @@ -51,7 +53,15 @@ export class HeaderComponent implements OnInit, OnDestroy { }, (errorResponse: HttpErrorResponse) => { console.error(errorResponse); if (errorResponse.status > 0) { - this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle); + this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle, { duration: 5000 }); + this.dialogService.open(ErrorDialogComponent, + { + hasBackdrop: true, + context: { + errorTitle: environment.defaultErrorTitle, + errorMessage: JSON.stringify(errorResponse.error), + }, + }); } else { this.toastrService.danger(environment.defaultErrorMessage, environment.defaultErrorTitle); } diff --git a/src/KiteHelper/ClientApp/src/app/account/account.module.ts b/src/KiteHelper/ClientApp/src/app/account/account.module.ts index c9c708d..037f2b5 100644 --- a/src/KiteHelper/ClientApp/src/app/account/account.module.ts +++ b/src/KiteHelper/ClientApp/src/app/account/account.module.ts @@ -9,6 +9,7 @@ import { NbButtonModule, NbCardModule, NbCheckboxModule, + NbDialogService, NbIconModule, NbInputModule, NbLayoutModule, @@ -21,6 +22,7 @@ import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { NbAuthModule } from '@nebular/auth'; import { LogoutComponent } from './logout/logout.component'; +import { SharedModule } from '../shared/shared.module'; @NgModule({ declarations: [ @@ -45,6 +47,7 @@ import { LogoutComponent } from './logout/logout.component'; NbAuthModule, NbTooltipModule, NbToastrModule, + SharedModule, ], }) export class AccountModule { } diff --git a/src/KiteHelper/ClientApp/src/app/account/login/login.component.ts b/src/KiteHelper/ClientApp/src/app/account/login/login.component.ts index 87f4e10..ac7c1fc 100644 --- a/src/KiteHelper/ClientApp/src/app/account/login/login.component.ts +++ b/src/KiteHelper/ClientApp/src/app/account/login/login.component.ts @@ -1,9 +1,10 @@ import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; -import { NbToastrService } from '@nebular/theme'; +import { NbDialogService, NbToastrService } from '@nebular/theme'; import { KiteApiService, KiteLoginResponseModel } from 'src/app/services/api/kite-api.service'; import { CookieHelperService } from 'src/app/services/cookie-helper.service'; import { RoutingHelperService } from 'src/app/services/routing-helper.service'; +import { ErrorDialogComponent } from 'src/app/shared/error-dialog/error-dialog.component'; import { environment } from 'src/environments/environment'; class UserNgModel { @@ -26,6 +27,7 @@ export class LoginComponent implements OnInit { private toastrService: NbToastrService, private routingService: RoutingHelperService, private kiteApiService: KiteApiService, + private dialogService: NbDialogService, ) { } @@ -52,7 +54,15 @@ export class LoginComponent implements OnInit { }, (errorResponse: HttpErrorResponse) => { console.error(errorResponse); if (errorResponse.status > 0) { - this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle); + this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle, { duration: 5000 }); + this.dialogService.open(ErrorDialogComponent, + { + hasBackdrop: true, + context: { + errorTitle: environment.defaultErrorTitle, + errorMessage: JSON.stringify(errorResponse.error), + }, + }); } else { this.toastrService.danger(environment.defaultErrorMessage, environment.defaultErrorTitle); } diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/dashboard-routing.module.ts b/src/KiteHelper/ClientApp/src/app/dashboard/dashboard-routing.module.ts index 0652e1b..1e478e5 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/dashboard-routing.module.ts +++ b/src/KiteHelper/ClientApp/src/app/dashboard/dashboard-routing.module.ts @@ -2,7 +2,7 @@ import { RouterModule, Routes } from '@angular/router'; import { Component, NgModule } from '@angular/core'; import { DashboardComponent } from './dashboard.component'; -import { NotFoundComponent } from './shared/not-found/not-found.component'; +import { NotFoundComponent } from '../shared/not-found/not-found.component'; const routes: Routes = [ { diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/dashboard.module.ts b/src/KiteHelper/ClientApp/src/app/dashboard/dashboard.module.ts index a8331fe..4f35209 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/dashboard.module.ts +++ b/src/KiteHelper/ClientApp/src/app/dashboard/dashboard.module.ts @@ -4,7 +4,7 @@ import { NbCardModule, NbIconModule, NbMenuModule, NbSpinnerModule } from '@nebu import { ThemeModule } from '../@theme/theme.module'; import { DashboardComponent } from './dashboard.component'; import { DashboardRoutingModule } from './dashboard-routing.module'; -import { SharedModule } from './shared/shared.module'; +import { SharedModule } from '../shared/shared.module'; @NgModule({ @@ -16,7 +16,6 @@ import { SharedModule } from './shared/shared.module'; NbCardModule, NbIconModule, NbSpinnerModule, - SharedModule, ], declarations: [ DashboardComponent, diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/historical/download-historical-data/download-historical-data.component.ts b/src/KiteHelper/ClientApp/src/app/dashboard/historical/download-historical-data/download-historical-data.component.ts index 1164f91..6dde842 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/historical/download-historical-data/download-historical-data.component.ts +++ b/src/KiteHelper/ClientApp/src/app/dashboard/historical/download-historical-data/download-historical-data.component.ts @@ -1,8 +1,9 @@ import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Component, Input, OnInit } from '@angular/core'; -import { NbDialogRef, NbToastrService } from '@nebular/theme'; +import { NbDialogRef, NbDialogService, NbToastrService } from '@nebular/theme'; import { HistoricalDataResponseModel, KiteApiService, TradingSymbolResponseModel } from 'src/app/services/api/kite-api.service'; import { HelperService } from 'src/app/services/helper.service'; +import { ErrorDialogComponent } from 'src/app/shared/error-dialog/error-dialog.component'; import { environment } from 'src/environments/environment'; @Component({ @@ -27,6 +28,7 @@ export class DownloadHistoricalDataComponent implements OnInit { private toastrService: NbToastrService, private helperService: HelperService, private dialogRef: NbDialogRef, + private dialogService: NbDialogService, ) { } @@ -59,7 +61,15 @@ export class DownloadHistoricalDataComponent implements OnInit { }, (errorResponse: HttpErrorResponse) => { console.error(errorResponse); if (errorResponse.status > 0) { - this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle); + this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle, { duration: 5000 }); + this.dialogService.open(ErrorDialogComponent, + { + hasBackdrop: true, + context: { + errorTitle: environment.defaultErrorTitle, + errorMessage: JSON.stringify(errorResponse.error), + }, + }); } else { this.toastrService.danger(environment.defaultErrorMessage, environment.defaultErrorTitle); } diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical-data/historical-data.component.ts b/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical-data/historical-data.component.ts index 30a88d4..4033334 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical-data/historical-data.component.ts +++ b/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical-data/historical-data.component.ts @@ -2,6 +2,7 @@ import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Component, OnInit, ViewChild } from '@angular/core'; import { NbDialogService, NbToastrService } from '@nebular/theme'; import { KiteApiService, TradingSymbolResponseModel } from 'src/app/services/api/kite-api.service'; +import { ErrorDialogComponent } from 'src/app/shared/error-dialog/error-dialog.component'; import { environment } from 'src/environments/environment'; import { DownloadHistoricalDataComponent } from '../download-historical-data/download-historical-data.component'; @@ -48,7 +49,15 @@ export class HistoricalDataComponent implements OnInit { }, (errorResponse: HttpErrorResponse) => { console.error(errorResponse); if (errorResponse.status > 0) { - this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle); + this.toastrService.danger(JSON.stringify(errorResponse.error), environment.defaultErrorTitle, { duration: 5000 }); + this.dialogService.open(ErrorDialogComponent, + { + hasBackdrop: true, + context: { + errorTitle: environment.defaultErrorTitle, + errorMessage: JSON.stringify(errorResponse.error), + }, + }); } else { this.toastrService.danger(environment.defaultErrorMessage, environment.defaultErrorTitle); } diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical.module.ts b/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical.module.ts index 3b15e84..4029bdd 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical.module.ts +++ b/src/KiteHelper/ClientApp/src/app/dashboard/historical/historical.module.ts @@ -6,7 +6,7 @@ import { HistoricalDataComponent } from './historical-data/historical-data.compo import { HistoricalComponent } from './historical.component'; import { NbAutocompleteModule, NbButtonModule, NbCardModule, NbDatepickerModule, NbDialogModule, NbIconModule, NbInputModule, NbRadioModule, NbSpinnerModule, NbTimepickerModule } from '@nebular/theme'; import { FormsModule } from '@angular/forms'; -import { SharedModule } from '../shared/shared.module'; +import { SharedModule } from '../../shared/shared.module'; import { DownloadHistoricalDataComponent } from './download-historical-data/download-historical-data.component'; diff --git a/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.css b/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.html b/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.html new file mode 100644 index 0000000..7fa094f --- /dev/null +++ b/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.html @@ -0,0 +1,28 @@ + + +
+
+ {{errorTitle}} +
+
+
+ + +
+
+ +

{{errorMessage}}

+
+
+
+ +
+
+ +
+
+
+
\ No newline at end of file diff --git a/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.ts b/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.ts new file mode 100644 index 0000000..71c6d08 --- /dev/null +++ b/src/KiteHelper/ClientApp/src/app/shared/error-dialog/error-dialog.component.ts @@ -0,0 +1,23 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Clipboard } from '@angular/cdk/clipboard'; + +@Component({ + selector: 'app-error-dialog', + templateUrl: './error-dialog.component.html', + styleUrls: ['./error-dialog.component.css'], +}) +export class ErrorDialogComponent implements OnInit { + + @Input() public errorTitle: string; + @Input() public errorMessage: string; + + constructor(private clipboard: Clipboard) { } + + ngOnInit(): void { + } + + copyToClipboard(): void { + this.clipboard.copy(this.errorMessage); + } + +} diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.html b/src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.html similarity index 100% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.html rename to src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.html diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.scss b/src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.scss similarity index 100% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.scss rename to src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.scss diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.ts b/src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.ts similarity index 100% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/not-found/not-found.component.ts rename to src/KiteHelper/ClientApp/src/app/shared/not-found/not-found.component.ts diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/shared.module.ts b/src/KiteHelper/ClientApp/src/app/shared/shared.module.ts similarity index 61% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/shared.module.ts rename to src/KiteHelper/ClientApp/src/app/shared/shared.module.ts index eb86d5f..b7671e5 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/shared/shared.module.ts +++ b/src/KiteHelper/ClientApp/src/app/shared/shared.module.ts @@ -1,12 +1,13 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NotFoundComponent } from './not-found/not-found.component'; -import { NbAlertModule, NbButtonModule, NbCardModule, NbProgressBarModule, NbSpinnerModule } from '@nebular/theme'; +import { NbAlertModule, NbButtonModule, NbCardModule, NbIconModule, NbProgressBarModule, NbSpinnerModule } from '@nebular/theme'; import { TradingSymbolComponent } from './trading-symbol/trading-symbol.component'; +import { ErrorDialogComponent } from './error-dialog/error-dialog.component'; @NgModule({ - declarations: [NotFoundComponent, TradingSymbolComponent], + declarations: [NotFoundComponent, TradingSymbolComponent, ErrorDialogComponent], imports: [ CommonModule, NbCardModule, @@ -14,6 +15,7 @@ import { TradingSymbolComponent } from './trading-symbol/trading-symbol.componen NbAlertModule, NbSpinnerModule, NbProgressBarModule, + NbIconModule ], exports: [ NotFoundComponent, diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.html b/src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.html similarity index 100% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.html rename to src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.html diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.scss b/src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.scss similarity index 92% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.scss rename to src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.scss index 3cd1bd2..acf63a7 100644 --- a/src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.scss +++ b/src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.scss @@ -1,4 +1,4 @@ -@import "../../../@theme/styles/themes"; +@import "../../@theme/styles/themes"; @include nb-install-component() { .trading-symbol { diff --git a/src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.ts b/src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.ts similarity index 100% rename from src/KiteHelper/ClientApp/src/app/dashboard/shared/trading-symbol/trading-symbol.component.ts rename to src/KiteHelper/ClientApp/src/app/shared/trading-symbol/trading-symbol.component.ts diff --git a/src/KiteHelper/Controllers/KiteController.cs b/src/KiteHelper/Controllers/KiteController.cs index a2abad0..4d656fa 100644 --- a/src/KiteHelper/Controllers/KiteController.cs +++ b/src/KiteHelper/Controllers/KiteController.cs @@ -57,9 +57,15 @@ public async Task Login([FromBody] KiteLoginRequestModel kiteLogin return Unauthorized(); } } + catch (WebException we) + { + var (statusCode, responseString) = we.GetResponseStringNoException(); + Response.StatusCode = (int)statusCode; + return Content(responseString); + } catch (Exception e) { - _logger.LogError(e, "Error in Login"); + _logger.LogError(e, $"Error in {nameof(Login)}"); return new StatusCodeResult(500); } } @@ -72,9 +78,23 @@ public async Task Login([FromBody] KiteLoginRequestModel kiteLogin [KiteAuthorize] public async Task Profile() { - var kiteSdk = KiteSessionHelper.GetKiteSdkFromSession(Request.Headers.Authorization); - Response.StatusCode = (int)HttpStatusCode.OK; - return new JsonResult(kiteSdk?.GetProfile()); + try + { + var kiteSdk = KiteSessionHelper.GetKiteSdkFromSession(Request.Headers.Authorization); + Response.StatusCode = (int)HttpStatusCode.OK; + return new JsonResult(kiteSdk?.GetProfile()); + } + catch (WebException we) + { + var (statusCode, responseString) = we.GetResponseStringNoException(); + Response.StatusCode = (int)statusCode; + return Content(responseString); + } + catch (Exception e) + { + _logger.LogError(e, $"Error in {nameof(Profile)}"); + return new StatusCodeResult(500); + } } [HttpGet] @@ -83,15 +103,29 @@ public async Task Profile() [SwaggerResponse((int)HttpStatusCode.InternalServerError)] public async Task TradingSymbols([FromQuery()] TradingSymbolsRequestModel tradingSymbolsRequestModel) { - tradingSymbolsRequestModel.TradingSymbol = tradingSymbolsRequestModel.TradingSymbol?.ToUpper() ?? string.Empty; + try + { + tradingSymbolsRequestModel.TradingSymbol = tradingSymbolsRequestModel.TradingSymbol?.ToUpper() ?? string.Empty; - var result = _databaseContext.KiteInstrumentsEntity - .Where(myRow => string.IsNullOrWhiteSpace(tradingSymbolsRequestModel.TradingSymbol) || (myRow.TradingSymbol.ToUpper().Contains(tradingSymbolsRequestModel.TradingSymbol))) - .OrderBy(myRow => myRow.Expiry) - .Select(myRow => myRow).ToList(); + var result = _databaseContext.KiteInstrumentsEntity + .Where(myRow => string.IsNullOrWhiteSpace(tradingSymbolsRequestModel.TradingSymbol) || (myRow.TradingSymbol.ToUpper().Contains(tradingSymbolsRequestModel.TradingSymbol))) + .OrderBy(myRow => myRow.Expiry) + .Select(myRow => myRow).ToList(); - Response.StatusCode = (int)HttpStatusCode.OK; - return new JsonResult(result); + Response.StatusCode = (int)HttpStatusCode.OK; + return new JsonResult(result); + } + catch (WebException we) + { + var (statusCode, responseString) = we.GetResponseStringNoException(); + Response.StatusCode = (int)statusCode; + return Content(responseString); + } + catch (Exception e) + { + _logger.LogError(e, $"Error in {nameof(TradingSymbols)}"); + return new StatusCodeResult(500); + } } [HttpPost] @@ -102,41 +136,55 @@ public async Task TradingSymbols([FromQuery()] TradingSymbolsReque [KiteAuthorize] public async Task HistoricalData([FromBody] HistoricalDataRequestModel historicalDataRequestModel) { - historicalDataRequestModel.Exchange = historicalDataRequestModel.Exchange.ToUpper(); - historicalDataRequestModel.TradingSymbol = historicalDataRequestModel.TradingSymbol.ToUpper(); + try + { + historicalDataRequestModel.Exchange = historicalDataRequestModel.Exchange.ToUpper(); + historicalDataRequestModel.TradingSymbol = historicalDataRequestModel.TradingSymbol.ToUpper(); - // Getting instrument token from the trading symbol - var instrumentToken = _databaseContext.KiteInstrumentsEntity - .Where(myRow => (myRow.Exchange.ToUpper() == historicalDataRequestModel.Exchange)) - .Where(myRow => (myRow.TradingSymbol.ToUpper() == historicalDataRequestModel.TradingSymbol)) - .Select(myRow => myRow.InstrumentToken).FirstOrDefault(); + // Getting instrument token from the trading symbol + var instrumentToken = _databaseContext.KiteInstrumentsEntity + .Where(myRow => (myRow.Exchange.ToUpper() == historicalDataRequestModel.Exchange)) + .Where(myRow => (myRow.TradingSymbol.ToUpper() == historicalDataRequestModel.TradingSymbol)) + .Select(myRow => myRow.InstrumentToken).FirstOrDefault(); - // Getting Historical Data - var kiteSdk = KiteSessionHelper.GetKiteSdkFromSession(Request.Headers.Authorization); + // Getting Historical Data + var kiteSdk = KiteSessionHelper.GetKiteSdkFromSession(Request.Headers.Authorization); - List result = new List(); - foreach (var dateRange in SplitDateRange(historicalDataRequestModel.StartDateTime, historicalDataRequestModel.EndDateTime,50)) - { - var chunk = kiteSdk?.GetHistoricalData(instrumentToken, dateRange.Item1.ToLocalTime(), dateRange.Item2.ToLocalTime(), historicalDataRequestModel.Interval, false, true); - if (chunk != null) + List result = new List(); + foreach (var dateRange in SplitDateRange(historicalDataRequestModel.StartDateTime, historicalDataRequestModel.EndDateTime, 50)) { - result.AddRange(chunk); + var chunk = kiteSdk?.GetHistoricalData(instrumentToken, dateRange.Item1.ToLocalTime(), dateRange.Item2.ToLocalTime(), historicalDataRequestModel.Interval, false, true); + if (chunk != null) + { + result.AddRange(chunk); + } } - } - Response.StatusCode = (int)HttpStatusCode.OK; - return new JsonResult(result); + Response.StatusCode = (int)HttpStatusCode.OK; + return new JsonResult(result); - IEnumerable> SplitDateRange(DateTime start, DateTime end, int dayChunkSize) - { - DateTime chunkEnd; - while ((chunkEnd = start.AddDays(dayChunkSize)) < end) + IEnumerable> SplitDateRange(DateTime start, DateTime end, int dayChunkSize) { - yield return Tuple.Create(start, chunkEnd); - start = chunkEnd; + DateTime chunkEnd; + while ((chunkEnd = start.AddDays(dayChunkSize)) < end) + { + yield return Tuple.Create(start, chunkEnd); + start = chunkEnd; + } + yield return Tuple.Create(start, end); } - yield return Tuple.Create(start, end); + } + catch (WebException we) + { + var (statusCode, responseString) = we.GetResponseStringNoException(); + Response.StatusCode = (int)statusCode; + return Content(responseString); + } + catch (Exception e) + { + _logger.LogError(e, $"Error in {nameof(HistoricalData)}"); + return new StatusCodeResult(500); } } } diff --git a/src/KiteHelper/Helpers/CommonExtensions.cs b/src/KiteHelper/Helpers/CommonExtensions.cs new file mode 100644 index 0000000..14dc0d6 --- /dev/null +++ b/src/KiteHelper/Helpers/CommonExtensions.cs @@ -0,0 +1,36 @@ +using System.Net; +using System.Text; + +namespace KiteHelper.Helpers +{ + public static class CommonExtensions + { + /// + /// Reads Response content in string from WebException + /// + /// + /// + public static (HttpStatusCode statusCode, string? responseString) GetResponseStringNoException(this WebException webException) + { + if (webException.Response is HttpWebResponse response) + { + Stream responseStream = response.GetResponseStream(); + + StreamReader streamReader = new(responseStream, Encoding.Default); + + string responseContent = streamReader.ReadToEnd(); + HttpStatusCode statusCode = response.StatusCode; + + streamReader.Close(); + responseStream.Close(); + response.Close(); + + return (statusCode, responseContent); + } + else + { + return (HttpStatusCode.InternalServerError, null); + } + } + } +}