From 2b0590709ca895f58b9da84118e148677ff9b53e Mon Sep 17 00:00:00 2001 From: Kenta420-Poom Date: Wed, 27 Sep 2023 13:05:31 +0700 Subject: [PATCH 1/4] add modal detail --- .../src/app/core/layout/layout.component.html | 2 +- .../dashboard/dashboard.component.html | 20 ++----------- .../features/dashboard/dashboard.component.ts | 15 ++-------- .../shared/modal/recipe-modal.component.html | 30 +++++++++++++++++++ .../shared/modal/recipe-modal.component.ts | 28 +++++++++++++++++ 5 files changed, 64 insertions(+), 31 deletions(-) create mode 100644 client/src/app/shared/modal/recipe-modal.component.html create mode 100644 client/src/app/shared/modal/recipe-modal.component.ts diff --git a/client/src/app/core/layout/layout.component.html b/client/src/app/core/layout/layout.component.html index 5d820c9..aa05684 100644 --- a/client/src/app/core/layout/layout.component.html +++ b/client/src/app/core/layout/layout.component.html @@ -144,7 +144,7 @@
-
+
diff --git a/client/src/app/features/dashboard/dashboard.component.html b/client/src/app/features/dashboard/dashboard.component.html index f8f9c64..0e821b6 100644 --- a/client/src/app/features/dashboard/dashboard.component.html +++ b/client/src/app/features/dashboard/dashboard.component.html @@ -1,5 +1,5 @@
@@ -118,23 +118,7 @@ {{ recipe.LastChange | date : "dd-MMM-yyyy hh:mm:ss" }} diff --git a/client/src/app/features/dashboard/dashboard.component.ts b/client/src/app/features/dashboard/dashboard.component.ts index a0d75b2..e41e082 100644 --- a/client/src/app/features/dashboard/dashboard.component.ts +++ b/client/src/app/features/dashboard/dashboard.component.ts @@ -1,25 +1,16 @@ -import { - AfterContentChecked, - AfterRenderRef, - AfterViewChecked, - AfterViewInit, - Component, - ElementRef, - OnInit, - ViewChild, -} from '@angular/core'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { UserService } from 'src/app/core/services/user.service'; import { User } from 'src/app/core/models/user.model'; import { DatePipe, NgFor, NgIf } from '@angular/common'; import { Recipe, Recipe01 } from 'src/app/core/models/recipe.model'; import { RecipeService } from 'src/app/core/services/recipe.service'; -import { BehaviorSubject } from 'rxjs'; import { environment } from 'src/environments/environment'; +import { RecipeModalComponent } from 'src/app/shared/modal/recipe-modal.component'; @Component({ selector: 'app-dashboard', standalone: true, - imports: [NgIf, NgFor, DatePipe], + imports: [NgIf, NgFor, DatePipe, RecipeModalComponent], templateUrl: './dashboard.component.html', }) export class DashboardComponent implements OnInit { diff --git a/client/src/app/shared/modal/recipe-modal.component.html b/client/src/app/shared/modal/recipe-modal.component.html new file mode 100644 index 0000000..5d0b95f --- /dev/null +++ b/client/src/app/shared/modal/recipe-modal.component.html @@ -0,0 +1,30 @@ + + + + + diff --git a/client/src/app/shared/modal/recipe-modal.component.ts b/client/src/app/shared/modal/recipe-modal.component.ts new file mode 100644 index 0000000..e79e748 --- /dev/null +++ b/client/src/app/shared/modal/recipe-modal.component.ts @@ -0,0 +1,28 @@ +import { Component, ElementRef, Input, ViewChild } from '@angular/core'; + +@Component({ + selector: 'recipe-modal', + templateUrl: './recipe-modal.component.html', + standalone: true, +}) +export class RecipeModalComponent { + @Input({ required: true }) id!: string; + + private detailModal: ElementRef | null = null; + + @ViewChild('detailModal', { static: false }) set setDetailModal( + modal: ElementRef + ) { + this.detailModal = modal; + } + + openModal() { + this.detailModal?.nativeElement.showModal(); + + if (this.detailModal?.nativeElement.open) { + console.log('open'); + } else { + console.log('close'); + } + } +} From ac45ca47d5a18496eaefc4a61537efa12ab1def6 Mon Sep 17 00:00:00 2001 From: Kenta420-Poom Date: Wed, 27 Sep 2023 13:50:53 +0700 Subject: [PATCH 2/4] update recipe modal --- .../src/app/core/services/recipe.service.ts | 9 ++- .../shared/modal/recipe-modal.component.html | 56 ++++++++++++++++--- .../shared/modal/recipe-modal.component.ts | 38 ++++++++++++- server/routers/recipe.go | 19 +++++++ 4 files changed, 110 insertions(+), 12 deletions(-) diff --git a/client/src/app/core/services/recipe.service.ts b/client/src/app/core/services/recipe.service.ts index e75d3d4..e01aa73 100644 --- a/client/src/app/core/services/recipe.service.ts +++ b/client/src/app/core/services/recipe.service.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, distinctUntilChanged } from 'rxjs'; -import { Recipe } from '../models/recipe.model'; +import { Recipe, Recipe01 } from '../models/recipe.model'; import { environment } from 'src/environments/environment'; interface RecipeParams { @@ -33,4 +33,11 @@ export class RecipeService { responseType: 'json', }); } + + getRecipesById(id: string): Observable { + return this._httpClient.get(environment.api + '/recipes/' + id, { + withCredentials: true, + responseType: 'json', + }); + } } diff --git a/client/src/app/shared/modal/recipe-modal.component.html b/client/src/app/shared/modal/recipe-modal.component.html index 5d0b95f..3fa523c 100644 --- a/client/src/app/shared/modal/recipe-modal.component.html +++ b/client/src/app/shared/modal/recipe-modal.component.html @@ -18,13 +18,53 @@ diff --git a/client/src/app/shared/modal/recipe-modal.component.ts b/client/src/app/shared/modal/recipe-modal.component.ts index e79e748..1adfc77 100644 --- a/client/src/app/shared/modal/recipe-modal.component.ts +++ b/client/src/app/shared/modal/recipe-modal.component.ts @@ -1,13 +1,32 @@ import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { RecipeService } from 'src/app/core/services/recipe.service'; + +interface RecipeDetail { + productCode: string; + name: string; + otherName: string; + description: string; +} @Component({ selector: 'recipe-modal', templateUrl: './recipe-modal.component.html', + imports: [ReactiveFormsModule], standalone: true, }) export class RecipeModalComponent { @Input({ required: true }) id!: string; + title: string = 'Recipe Detail'; + + recipeDetail = new FormGroup({ + productCode: new FormControl(''), + name: new FormControl(''), + otherName: new FormControl(''), + description: new FormControl(''), + }); + private detailModal: ElementRef | null = null; @ViewChild('detailModal', { static: false }) set setDetailModal( @@ -16,13 +35,26 @@ export class RecipeModalComponent { this.detailModal = modal; } + constructor(private recipeService: RecipeService) {} + openModal() { this.detailModal?.nativeElement.showModal(); if (this.detailModal?.nativeElement.open) { - console.log('open'); - } else { - console.log('close'); + this.recipeService.getRecipesById(this.id).subscribe((recipe) => { + this.title = recipe.name + ' | ' + recipe.productCode; + this.recipeDetail.setValue({ + productCode: recipe.productCode, + name: recipe.name, + otherName: recipe.otherName, + description: recipe.Description, + }); + }); } } + + save() { + console.log(this.recipeDetail.value); + this.detailModal?.nativeElement.close(); + } } diff --git a/server/routers/recipe.go b/server/routers/recipe.go index 936af58..6dec754 100644 --- a/server/routers/recipe.go +++ b/server/routers/recipe.go @@ -67,6 +67,25 @@ func (rr *RecipeRouter) Route(r chi.Router) { }) }) + r.Get("/{id}", func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/json") + id, err := strconv.ParseUint(chi.URLParam(r, "id"), 10, 64) + if err != nil { + http.Error(w, "Invalid ID", http.StatusBadRequest) + return + } + + recipe := rr.data.GetRecipe01() + for _, v := range recipe { + if uint64(v.ID) == id { + json.NewEncoder(w).Encode(v) + return + } + } + + http.Error(w, "Recipe not found", http.StatusNotFound) + }) + r.Get("/json", func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") json.NewEncoder(w).Encode(rr.data.GetRecipe()) From 2328da0ce877e609991b37d85c838f9129c0e181 Mon Sep 17 00:00:00 2001 From: Kenta420-Poom Date: Thu, 28 Sep 2023 14:12:09 +0700 Subject: [PATCH 3/4] update recipe modal --- client/angular.json | 5 +- client/package-lock.json | 11 ++- client/package.json | 4 +- .../shared/modal/recipe-modal.component.html | 27 +++++--- .../shared/modal/recipe-modal.component.ts | 40 +++++++++-- server/.gitignore | 1 + server/go.mod | 15 ++++ server/go.sum | 28 ++++++++ server/helpers/googleconfig.go | 47 +++++++++++++ server/services/oauth/oauth.go | 31 +++------ server/services/sheet/sheet.go | 69 +++++++++++++++++++ 11 files changed, 238 insertions(+), 40 deletions(-) create mode 100644 server/helpers/googleconfig.go create mode 100644 server/services/sheet/sheet.go diff --git a/client/angular.json b/client/angular.json index 47bbf25..41d4a9d 100644 --- a/client/angular.json +++ b/client/angular.json @@ -13,6 +13,9 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { + "allowedCommonJsDependencies": [ + "lodash" + ], "outputPath": "dist/client", "index": "src/index.html", "main": "src/main.ts", @@ -101,4 +104,4 @@ } } } -} +} \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 6f387e3..0ef0a6f 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -17,6 +17,7 @@ "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -27,6 +28,7 @@ "@angular/compiler-cli": "^16.2.0", "@types/google.accounts": "^0.0.9", "@types/jasmine": "~4.3.0", + "@types/lodash": "^4.14.199", "autoprefixer": "^10.4.15", "daisyui": "^3.7.7", "jasmine-core": "~4.6.0", @@ -3383,6 +3385,12 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -8026,8 +8034,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", diff --git a/client/package.json b/client/package.json index 73aeb37..3cb1025 100644 --- a/client/package.json +++ b/client/package.json @@ -19,6 +19,7 @@ "@angular/platform-browser-dynamic": "^16.2.0", "@angular/router": "^16.2.0", "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" @@ -29,6 +30,7 @@ "@angular/compiler-cli": "^16.2.0", "@types/google.accounts": "^0.0.9", "@types/jasmine": "~4.3.0", + "@types/lodash": "^4.14.199", "autoprefixer": "^10.4.15", "daisyui": "^3.7.7", "jasmine-core": "~4.6.0", @@ -41,4 +43,4 @@ "tailwindcss": "^3.3.3", "typescript": "~5.1.3" } -} \ No newline at end of file +} diff --git a/client/src/app/shared/modal/recipe-modal.component.html b/client/src/app/shared/modal/recipe-modal.component.html index 3fa523c..d3c9897 100644 --- a/client/src/app/shared/modal/recipe-modal.component.html +++ b/client/src/app/shared/modal/recipe-modal.component.html @@ -19,11 +19,7 @@ + + + + diff --git a/client/src/app/shared/modal/recipe-modal.component.ts b/client/src/app/shared/modal/recipe-modal.component.ts index 1adfc77..d2a7cf9 100644 --- a/client/src/app/shared/modal/recipe-modal.component.ts +++ b/client/src/app/shared/modal/recipe-modal.component.ts @@ -1,5 +1,6 @@ import { Component, ElementRef, Input, ViewChild } from '@angular/core'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { isEqual } from 'lodash'; import { RecipeService } from 'src/app/core/services/recipe.service'; interface RecipeDetail { @@ -21,12 +22,14 @@ export class RecipeModalComponent { title: string = 'Recipe Detail'; recipeDetail = new FormGroup({ - productCode: new FormControl(''), - name: new FormControl(''), - otherName: new FormControl(''), - description: new FormControl(''), + productCode: new FormControl(''), + name: new FormControl(''), + otherName: new FormControl(''), + description: new FormControl(''), }); + originalRecipeDetail: RecipeDetail | null = null; + private detailModal: ElementRef | null = null; @ViewChild('detailModal', { static: false }) set setDetailModal( @@ -35,6 +38,14 @@ export class RecipeModalComponent { this.detailModal = modal; } + private confirmModal: ElementRef | null = null; + + @ViewChild('confirmModal', { static: false }) set setConfirmModal( + modal: ElementRef + ) { + this.confirmModal = modal; + } + constructor(private recipeService: RecipeService) {} openModal() { @@ -43,12 +54,21 @@ export class RecipeModalComponent { if (this.detailModal?.nativeElement.open) { this.recipeService.getRecipesById(this.id).subscribe((recipe) => { this.title = recipe.name + ' | ' + recipe.productCode; - this.recipeDetail.setValue({ + this.recipeDetail.patchValue( + { + productCode: recipe.productCode, + name: recipe.name, + otherName: recipe.otherName, + description: recipe.Description, + }, + { emitEvent: false } + ); + this.originalRecipeDetail = { productCode: recipe.productCode, name: recipe.name, otherName: recipe.otherName, description: recipe.Description, - }); + }; }); } } @@ -57,4 +77,12 @@ export class RecipeModalComponent { console.log(this.recipeDetail.value); this.detailModal?.nativeElement.close(); } + + close() { + if (!isEqual(this.recipeDetail.value, this.originalRecipeDetail)) { + this.confirmModal?.nativeElement.showModal(); + } else { + this.detailModal?.nativeElement.close(); + } + } } diff --git a/server/.gitignore b/server/.gitignore index 779df15..6a9ca81 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,4 +1,5 @@ /cofffeemachineConfig **/*.log +token.json client_secret.json app.env \ No newline at end of file diff --git a/server/go.mod b/server/go.mod index 2cc6893..b3dc43a 100644 --- a/server/go.mod +++ b/server/go.mod @@ -8,6 +8,21 @@ require ( golang.org/x/oauth2 v0.12.0 ) +require ( + cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/crypto v0.13.0 // indirect + google.golang.org/api v0.143.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/grpc v1.57.0 // indirect +) + require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect diff --git a/server/go.sum b/server/go.sum index cb2565c..5ec0e34 100644 --- a/server/go.sum +++ b/server/go.sum @@ -23,6 +23,10 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -67,6 +71,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -101,6 +107,7 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= @@ -119,9 +126,17 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= +github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -170,6 +185,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= @@ -183,6 +199,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -194,6 +212,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -255,6 +275,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -404,6 +425,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= +google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -448,6 +471,9 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -464,6 +490,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/server/helpers/googleconfig.go b/server/helpers/googleconfig.go new file mode 100644 index 0000000..aed8df6 --- /dev/null +++ b/server/helpers/googleconfig.go @@ -0,0 +1,47 @@ +package helpers + +import ( + "encoding/json" + "fmt" + "os" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" +) + +func GetClientSecret(path string) (*oauth2.Config, error) { + b, err := os.ReadFile("client_secret.json") + + if err != nil { + return nil, fmt.Errorf("unable to read client secret file: %v", err) + } + + clientSecret, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/spreadsheets.readonly") + + if err != nil { + return nil, fmt.Errorf("unable to parse client secret file to config: %v", err) + } + + return clientSecret, nil +} + +func GetToken(path string) (*oauth2.Token, error) { + file, err := os.Open(path) + + if err != nil { + return nil, fmt.Errorf("unable to read token file: %v", err) + } + + token := map[string]string{} + + err = json.NewDecoder(file).Decode(&token) + + if err != nil { + return nil, fmt.Errorf("unable to parse token file to token: %v", err) + } + + return &oauth2.Token{ + AccessToken: token["access_token"], + RefreshToken: token["refresh_token"], + }, nil +} diff --git a/server/services/oauth/oauth.go b/server/services/oauth/oauth.go index 9a4f66d..a553e93 100644 --- a/server/services/oauth/oauth.go +++ b/server/services/oauth/oauth.go @@ -4,8 +4,9 @@ import ( "context" "encoding/json" "errors" - "os" + "log" "recipe-manager/config" + "recipe-manager/helpers" "recipe-manager/models" "golang.org/x/oauth2" @@ -28,28 +29,18 @@ type oauthService struct { func NewOAuthService(cfg *config.ServerConfig) OAuthService { - file, err := os.Open("client_secret.json") - if err != nil { - panic(err) - } - defer file.Close() + clientSecret, err := helpers.GetClientSecret("client_secret.json") - var clientSecret map[string]interface{} - json.NewDecoder(file).Decode(&clientSecret) + if err != nil { + log.Fatalf("Unable to get client secret: %v", err) + } + + clientSecret.RedirectURL = cfg.ServerDomain + "/auth/google/callback" return &oauthService{ - cfg: cfg, - gConfig: &oauth2.Config{ - ClientID: clientSecret["web"].(map[string]interface{})["client_id"].(string), - ClientSecret: clientSecret["web"].(map[string]interface{})["client_secret"].(string), - RedirectURL: cfg.ServerDomain + "/auth/google/callback", - Scopes: []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"}, - Endpoint: oauth2.Endpoint{ - AuthURL: clientSecret["web"].(map[string]interface{})["auth_uri"].(string), - TokenURL: clientSecret["web"].(map[string]interface{})["token_uri"].(string), - }, - }, - nonce: make(map[string]map[string]string), + cfg: cfg, + gConfig: clientSecret, + nonce: make(map[string]map[string]string), } } diff --git a/server/services/sheet/sheet.go b/server/services/sheet/sheet.go new file mode 100644 index 0000000..f2cdc48 --- /dev/null +++ b/server/services/sheet/sheet.go @@ -0,0 +1,69 @@ +package sheet + +import ( + "context" + "recipe-manager/helpers" + + "golang.org/x/oauth2" + "google.golang.org/api/option" + "google.golang.org/api/sheets/v4" +) + +type SheetService interface { +} + +type sheetService struct { + config *oauth2.Config + service *sheets.Service +} + +func NewSheetService(ctx context.Context) (SheetService, error) { + clientSecret, err := helpers.GetClientSecret("client_secret.json") + + if err != nil { + return nil, err + } + + token, err := helpers.GetToken("token.json") + + if err != nil { + return nil, err + } + + service, err := sheets.NewService(ctx, option.WithTokenSource(clientSecret.TokenSource(ctx, token))) + + if err != nil { + return nil, err + } + + return &sheetService{ + config: clientSecret, + service: service, + }, nil +} + +func (s *sheetService) GetSheet(ctx context.Context, sheetID string) { + spreadSheet, err := s.service.Spreadsheets.Get(sheetID).Do() + + if err != nil { + panic(err) + } + + for _, sheet := range spreadSheet.Sheets { + // print data collumn C + readRange := sheet.Properties.Title + "!C:C" + resp, err := s.service.Spreadsheets.Values.Get(sheetID, readRange).Do() + + if err != nil { + panic(err) + } + + if len(resp.Values) == 0 { + println("No data found") + } else { + for _, row := range resp.Values { + println(row[0].(string)) + } + } + } +} From 4f7d5a287af3078e6536545b5cacb4371bda4b13 Mon Sep 17 00:00:00 2001 From: Kenta420 Date: Tue, 3 Oct 2023 09:35:33 +0700 Subject: [PATCH 4/4] update mod and sum --- server/go.mod | 8 ++++---- server/go.sum | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/server/go.mod b/server/go.mod index b3dc43a..de3f024 100644 --- a/server/go.mod +++ b/server/go.mod @@ -6,6 +6,7 @@ require ( github.com/go-chi/chi/v5 v5.0.10 github.com/go-chi/cors v1.2.1 golang.org/x/oauth2 v0.12.0 + google.golang.org/api v0.143.0 ) require ( @@ -18,9 +19,9 @@ require ( github.com/googleapis/gax-go/v2 v2.12.0 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.13.0 // indirect - google.golang.org/api v0.143.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect google.golang.org/grpc v1.57.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) require ( @@ -30,16 +31,15 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible - github.com/natefinch/lumberjack/v3 v3.0.0-alpha // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.16.0 // indirect + github.com/spf13/viper v1.16.0 github.com/subosito/gotenv v1.4.2 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect + go.uber.org/zap v1.26.0 golang.org/x/net v0.15.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/server/go.sum b/server/go.sum index 5ec0e34..97ee4bd 100644 --- a/server/go.sum +++ b/server/go.sum @@ -40,6 +40,7 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -51,6 +52,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -58,6 +60,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= @@ -149,23 +153,28 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= -github.com/natefinch/lumberjack/v3 v3.0.0-alpha h1:HZ2AJF20D1lo9S0F/rpgkFbPGam5dgR3X0KUtZA5mlY= -github.com/natefinch/lumberjack/v3 v3.0.0-alpha/go.mod h1:rPTlHhMjhrvPAhqKh0FC57E0pXZoanrXgMDj4yv5wcM= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= @@ -186,6 +195,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= @@ -201,6 +211,8 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -303,6 +315,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -472,6 +486,9 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -507,10 +524,14 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-
- -
+