From d85c8e37aac4c2b92d684da45a3091cc6a048c52 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 17:56:16 -0800 Subject: [PATCH 1/9] enable tabs --- client-v2/app/(auth)/sign-in.tsx | 4 +-- client-v2/app/(auth)/sign-up.tsx | 4 +-- client-v2/app/(home)/_layout.tsx | 5 ---- client-v2/app/(tabs)/_layout.tsx | 27 ++++++++++++++++++++ client-v2/app/{(home) => (tabs)}/index.tsx | 0 client-v2/app/(tabs)/settings.tsx | 17 ++++++++++++ client-v2/components/sign-in-with-o-auth.tsx | 2 +- 7 files changed, 49 insertions(+), 10 deletions(-) delete mode 100644 client-v2/app/(home)/_layout.tsx create mode 100644 client-v2/app/(tabs)/_layout.tsx rename client-v2/app/{(home) => (tabs)}/index.tsx (100%) create mode 100644 client-v2/app/(tabs)/settings.tsx diff --git a/client-v2/app/(auth)/sign-in.tsx b/client-v2/app/(auth)/sign-in.tsx index ac584cbf..013abbe8 100644 --- a/client-v2/app/(auth)/sign-in.tsx +++ b/client-v2/app/(auth)/sign-in.tsx @@ -63,7 +63,7 @@ export default function Page() { if (completeSignIn.status === "complete") { await setActive({ session: completeSignIn.createdSessionId }); - router.replace("/(home)"); + router.replace("/(tabs)"); } else { // See https://clerk.com/docs/custom-flows/error-handling // for more info on error handling @@ -79,7 +79,7 @@ export default function Page() { - + diff --git a/client-v2/app/(auth)/sign-up.tsx b/client-v2/app/(auth)/sign-up.tsx index 3555d30d..c29dc9fa 100644 --- a/client-v2/app/(auth)/sign-up.tsx +++ b/client-v2/app/(auth)/sign-up.tsx @@ -44,7 +44,7 @@ export default function SignUpScreen() { if (completeSignUp.status === "complete") { await setActive({ session: completeSignUp.createdSessionId }); - router.replace("/(home)"); + router.replace("/(tabs)"); } else { console.error(JSON.stringify(completeSignUp, null, 2)); } @@ -59,7 +59,7 @@ export default function SignUpScreen() { - + diff --git a/client-v2/app/(home)/_layout.tsx b/client-v2/app/(home)/_layout.tsx deleted file mode 100644 index 3883a88c..00000000 --- a/client-v2/app/(home)/_layout.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Stack } from "expo-router/stack"; - -export default function Layout() { - return ; -} diff --git a/client-v2/app/(tabs)/_layout.tsx b/client-v2/app/(tabs)/_layout.tsx new file mode 100644 index 00000000..934a1f9e --- /dev/null +++ b/client-v2/app/(tabs)/_layout.tsx @@ -0,0 +1,27 @@ +import FontAwesome from "@expo/vector-icons/FontAwesome"; +import { Tabs } from "expo-router"; + +export default function TabLayout() { + return ( + + ( + + ), + }} + /> + ( + + ), + }} + /> + + ); +} diff --git a/client-v2/app/(home)/index.tsx b/client-v2/app/(tabs)/index.tsx similarity index 100% rename from client-v2/app/(home)/index.tsx rename to client-v2/app/(tabs)/index.tsx diff --git a/client-v2/app/(tabs)/settings.tsx b/client-v2/app/(tabs)/settings.tsx new file mode 100644 index 00000000..567c3c3c --- /dev/null +++ b/client-v2/app/(tabs)/settings.tsx @@ -0,0 +1,17 @@ +import { View, Text, StyleSheet } from "react-native"; + +export default function Tab() { + return ( + + Tab [Settings] + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, +}); diff --git a/client-v2/components/sign-in-with-o-auth.tsx b/client-v2/components/sign-in-with-o-auth.tsx index 6b628303..e85ae6b2 100644 --- a/client-v2/components/sign-in-with-o-auth.tsx +++ b/client-v2/components/sign-in-with-o-auth.tsx @@ -38,7 +38,7 @@ export const SignInWithOAuth = () => { // Use signIn or signUp for next steps such as MFA console.log("session created but no further action taken"); } - router.navigate("/(home)"); + router.navigate("/(tabs)"); } catch (err) { console.error("OAuth error", err); } From d348770dddcf92bebeb3f635e091e54e5a16bbd3 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:00:26 -0800 Subject: [PATCH 2/9] add post tab --- client-v2/app/(tabs)/_layout.tsx | 2 ++ client-v2/app/(tabs)/post.tsx | 10 ++++++++++ client-v2/app/(tabs)/settings.tsx | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 client-v2/app/(tabs)/post.tsx diff --git a/client-v2/app/(tabs)/_layout.tsx b/client-v2/app/(tabs)/_layout.tsx index 934a1f9e..422a6dd8 100644 --- a/client-v2/app/(tabs)/_layout.tsx +++ b/client-v2/app/(tabs)/_layout.tsx @@ -1,4 +1,5 @@ import FontAwesome from "@expo/vector-icons/FontAwesome"; +import { BottomTabBarHeightCallbackContext } from "@react-navigation/bottom-tabs"; import { Tabs } from "expo-router"; export default function TabLayout() { @@ -22,6 +23,7 @@ export default function TabLayout() { ), }} /> + ); } diff --git a/client-v2/app/(tabs)/post.tsx b/client-v2/app/(tabs)/post.tsx new file mode 100644 index 00000000..7ac9b3f5 --- /dev/null +++ b/client-v2/app/(tabs)/post.tsx @@ -0,0 +1,10 @@ +import { SafeAreaView } from "react-native-safe-area-context"; +import { Text } from "react-native"; + +export default function PostTab() { + return ( + + Hello Post Tab + + ); +} diff --git a/client-v2/app/(tabs)/settings.tsx b/client-v2/app/(tabs)/settings.tsx index 567c3c3c..ee4633e0 100644 --- a/client-v2/app/(tabs)/settings.tsx +++ b/client-v2/app/(tabs)/settings.tsx @@ -1,6 +1,6 @@ import { View, Text, StyleSheet } from "react-native"; -export default function Tab() { +export default function SettingsTab() { return ( Tab [Settings] From 5403ca9ac55cf33c247ecc19b5ee2e49500dc1b2 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:36:42 -0800 Subject: [PATCH 3/9] add image picker and rename orval sdk folder --- Makefile | 2 +- client-v2/app.json | 6 ++ client-v2/app/(tabs)/post.tsx | 60 ++++++++++++++++++- .../{gen/openapi.ts => lib/api/happened.ts} | 0 client-v2/package-lock.json | 20 +++++++ client-v2/package.json | 3 +- 6 files changed, 88 insertions(+), 3 deletions(-) rename client-v2/{gen/openapi.ts => lib/api/happened.ts} (100%) diff --git a/Makefile b/Makefile index 9004c062..ddb30972 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,6 @@ watch: # Generates the client SDK from the server's current OpenAPI spec. gen: @$(MAKE) -C api openapi - @orval --input ./api/openapi.yaml --output ./client-v2/gen/openapi.ts + @orval --input ./api/openapi.yaml --output ./client-v2/lib/api/happened.ts diff --git a/client-v2/app.json b/client-v2/app.json index f4c7ef93..d01524b7 100644 --- a/client-v2/app.json +++ b/client-v2/app.json @@ -34,6 +34,12 @@ "resizeMode": "contain", "backgroundColor": "#ffffff" } + ], + [ + "expo-image-picker", + { + "photosPermission": "The app accesses your photos to let you share them with your friends." + } ] ], "experiments": { diff --git a/client-v2/app/(tabs)/post.tsx b/client-v2/app/(tabs)/post.tsx index 7ac9b3f5..0fb7b3ad 100644 --- a/client-v2/app/(tabs)/post.tsx +++ b/client-v2/app/(tabs)/post.tsx @@ -1,10 +1,68 @@ import { SafeAreaView } from "react-native-safe-area-context"; -import { Text } from "react-native"; +import { Text, TouchableOpacity, Image } from "react-native"; +import { useState } from "react"; +import * as ImagePicker from "expo-image-picker"; +import { ImagePickerAsset } from "expo-image-picker"; +import * as Crypto from "expo-crypto"; export default function PostTab() { + const [images, setImages] = useState([]); + + const pickImage = async () => { + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ["images"], + allowsEditing: false, + aspect: [4, 3], + quality: 1, + allowsMultipleSelection: true, + selectionLimit: 10, + exif: true, + }); + console.log(result); + if (!result.canceled) { + setImages(result.assets); + } + }; + return ( Hello Post Tab + + + Select Image for Upload + + {images && ( + + )} + + { + // try { + // const imageKey = Crypto.randomUUID(); + // console.log("imageKey", imageKey); + // // const { uploadUrl, headers, method } = + // // await client.getUploadImageURL({ + // // imageKey, + // // }); + // // console.log("messages", images[0].base64); + // // const res = await fetch(uploadUrl, { + // // headers: headers, + // // method + // // }) + // // setUrl(uploadUrl); + // console.log("uploadUrl", uploadUrl); + // } catch (e) { + // if (e instanceof ConnectError) { + // console.error(e.cause, e.details, e.code); + // } + // } + }} + > + Upload Image + ); } diff --git a/client-v2/gen/openapi.ts b/client-v2/lib/api/happened.ts similarity index 100% rename from client-v2/gen/openapi.ts rename to client-v2/lib/api/happened.ts diff --git a/client-v2/package-lock.json b/client-v2/package-lock.json index 47e701f6..c1c96b69 100644 --- a/client-v2/package-lock.json +++ b/client-v2/package-lock.json @@ -19,6 +19,7 @@ "expo-dev-client": "~5.0.4", "expo-font": "~13.0.1", "expo-haptics": "~14.0.0", + "expo-image-picker": "~16.0.3", "expo-linking": "~7.0.3", "expo-router": "~4.0.9", "expo-secure-store": "^14.0.0", @@ -9180,6 +9181,25 @@ "expo": "*" } }, + "node_modules/expo-image-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-5.0.0.tgz", + "integrity": "sha512-Eg+5FHtyzv3Jjw9dHwu2pWy4xjf8fu3V0Asyy42kO+t/FbvW/vjUixpTjPtgKQLQh+2/9Nk4JjFDV6FwCnF2ZA==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-16.0.3.tgz", + "integrity": "sha512-c4IOqIQOtx8puWWU4fVsJhuGiAhH6gAIdrVzhimOXSEUHnfxCckRYzvznbd/0cuvaA5y9H0CSYrxpTUc/0WNVw==", + "dependencies": { + "expo-image-loader": "~5.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-json-utils": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.14.0.tgz", diff --git a/client-v2/package.json b/client-v2/package.json index 7b321769..a8792e26 100644 --- a/client-v2/package.json +++ b/client-v2/package.json @@ -47,7 +47,8 @@ "react-native-screens": "~4.1.0", "react-native-web": "~0.19.13", "react-native-webview": "13.12.2", - "tailwindcss": "^3.4.15" + "tailwindcss": "^3.4.15", + "expo-image-picker": "~16.0.3" }, "devDependencies": { "@babel/core": "^7.25.2", From 7d938557b2828b375f4e1677c30cff1531c29422 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 19:50:26 -0800 Subject: [PATCH 4/9] client upload flow --- api/cmd/api/main.go | 3 ++- api/openapi.yaml | 6 +++--- api/pkg/images/image_service.go | 3 ++- api/pkg/server/routes.go | 8 ++++--- client-v2/app/(tabs)/index.tsx | 2 +- client-v2/app/(tabs)/post.tsx | 37 +++++++++++++++------------------ client-v2/lib/api/happened.ts | 11 +++++----- client-v2/lib/api/upload.ts | 27 ++++++++++++++++++++++++ 8 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 client-v2/lib/api/upload.ts diff --git a/api/cmd/api/main.go b/api/cmd/api/main.go index 182b20f9..da996183 100644 --- a/api/cmd/api/main.go +++ b/api/cmd/api/main.go @@ -109,12 +109,13 @@ func main() { } logger.Info("successfully pinged db") - cfg, err := awsConfig.LoadDefaultConfig(ctx) + cfg, err := awsConfig.LoadDefaultConfig(ctx, awsConfig.WithRegion("us-west-2")) if err != nil { logger.Error("loading default aws config", slog.Any("error", err)) os.Exit(1) } + // Setup S3 bucket s3Client := s3.NewFromConfig(cfg) s3PresignClient := s3.NewPresignClient(s3Client) diff --git a/api/openapi.yaml b/api/openapi.yaml index e52eb10f..5a97dee1 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -128,8 +128,8 @@ info: openapi: 3.1.0 paths: /create-upload-url: - get: - operationId: get-create-upload-url + post: + operationId: post-create-upload-url requestBody: content: application/json: @@ -149,7 +149,7 @@ paths: schema: $ref: "#/components/schemas/ErrorModel" description: Error - summary: Get create upload URL + summary: Post create upload URL /greeting/protected/{name}: get: description: Protected version of greet diff --git a/api/pkg/images/image_service.go b/api/pkg/images/image_service.go index 88e75e04..c2dde714 100644 --- a/api/pkg/images/image_service.go +++ b/api/pkg/images/image_service.go @@ -2,10 +2,11 @@ package images import ( "context" - v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" "log" "time" + v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go/aws" ) diff --git a/api/pkg/server/routes.go b/api/pkg/server/routes.go index de58c962..682b45aa 100644 --- a/api/pkg/server/routes.go +++ b/api/pkg/server/routes.go @@ -3,17 +3,19 @@ package server import ( "database/sql" "fmt" - "github.com/clerk/clerk-sdk-go/v2/jwt" "log/slog" "net/http" "strings" + "github.com/clerk/clerk-sdk-go/v2/jwt" + "github.com/danielgtaylor/huma/v2/adapters/humachi" + "happenedapi/pkg/images" + "github.com/danielgtaylor/huma/v2" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" - "happenedapi/pkg/images" ) type HumaMiddleware func(ctx huma.Context, next func(huma.Context)) @@ -94,6 +96,6 @@ func registerRoutes( }, }, protectedGreetHandler()) - huma.Get(api, "/create-upload-url", CreateUploadURLHandler(imageService)) + huma.Post(api, "/create-upload-url", CreateUploadURLHandler(imageService)) } diff --git a/client-v2/app/(tabs)/index.tsx b/client-v2/app/(tabs)/index.tsx index 91dc1127..56972990 100644 --- a/client-v2/app/(tabs)/index.tsx +++ b/client-v2/app/(tabs)/index.tsx @@ -1,4 +1,4 @@ -import { getGreeting } from "@/gen/openapi"; +import { getGreeting } from "@/lib/api/happened"; import { SignedIn, SignedOut, useClerk, useUser } from "@clerk/clerk-expo"; import axios, { AxiosError } from "axios"; import { Link } from "expo-router"; diff --git a/client-v2/app/(tabs)/post.tsx b/client-v2/app/(tabs)/post.tsx index 0fb7b3ad..00784ebe 100644 --- a/client-v2/app/(tabs)/post.tsx +++ b/client-v2/app/(tabs)/post.tsx @@ -4,6 +4,8 @@ import { useState } from "react"; import * as ImagePicker from "expo-image-picker"; import { ImagePickerAsset } from "expo-image-picker"; import * as Crypto from "expo-crypto"; +import { postCreateUploadUrl } from "@/lib/api/happened"; +import { uploadImage } from "@/lib/api/upload"; export default function PostTab() { const [images, setImages] = useState([]); @@ -18,7 +20,7 @@ export default function PostTab() { selectionLimit: 10, exif: true, }); - console.log(result); + // console.log(result); if (!result.canceled) { setImages(result.assets); } @@ -40,25 +42,20 @@ export default function PostTab() { { - // try { - // const imageKey = Crypto.randomUUID(); - // console.log("imageKey", imageKey); - // // const { uploadUrl, headers, method } = - // // await client.getUploadImageURL({ - // // imageKey, - // // }); - // // console.log("messages", images[0].base64); - // // const res = await fetch(uploadUrl, { - // // headers: headers, - // // method - // // }) - // // setUrl(uploadUrl); - // console.log("uploadUrl", uploadUrl); - // } catch (e) { - // if (e instanceof ConnectError) { - // console.error(e.cause, e.details, e.code); - // } - // } + const imageKey = Crypto.randomUUID(); + const res = await postCreateUploadUrl({ image_key: imageKey }).catch( + console.error, + ); + + if (res) { + console.log("got response"); + + const { method, signed_headers, upload_url } = res.data; + + console.log("data", res.data); + + await uploadImage(upload_url, signed_headers, images[0].uri); + } }} > Upload Image diff --git a/client-v2/lib/api/happened.ts b/client-v2/lib/api/happened.ts index cee0c28f..02cbcbfb 100644 --- a/client-v2/lib/api/happened.ts +++ b/client-v2/lib/api/happened.ts @@ -95,13 +95,14 @@ export interface CreateUploadURLBody { /** - * @summary Get create upload URL + * @summary Post create upload URL */ -export const getCreateUploadUrl = >( +export const postCreateUploadUrl = >( createUploadURLRequestBody: NonReadonly, options?: AxiosRequestConfig ): Promise => { - return axios.get( - `/create-upload-url`,options + return axios.post( + `/create-upload-url`, + createUploadURLRequestBody,options ); } @@ -129,6 +130,6 @@ export const getGreeting = >( ); } -export type GetCreateUploadUrlResult = AxiosResponse +export type PostCreateUploadUrlResult = AxiosResponse export type ProtectedGreetResult = AxiosResponse export type GetGreetingResult = AxiosResponse diff --git a/client-v2/lib/api/upload.ts b/client-v2/lib/api/upload.ts new file mode 100644 index 00000000..5d615770 --- /dev/null +++ b/client-v2/lib/api/upload.ts @@ -0,0 +1,27 @@ +import axios from "axios"; +import * as FileSystem from "expo-file-system"; +import { Buffer } from "buffer"; + +export async function uploadImage( + upload_url: string, + signed_headers: Record, + imageUri: string, +) { + const base64 = await FileSystem.readAsStringAsync(imageUri, { + encoding: FileSystem.EncodingType.Base64, + }); + console.log("base64", base64.length); + + try { + const bytes = new Uint8Array(Buffer.from(base64, "base64")); + console.log("uploading image"); + console.log("uploading image"); + const resp = await axios.put(upload_url, bytes, { + headers: signed_headers, + }); + + console.log("done uploading image", resp); + } catch (e) { + console.error(e); + } +} From ef64f798af4e3fd0d25a3b43a5461f3d51e1e122 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:10:06 -0800 Subject: [PATCH 5/9] upload images async and in parallel --- client-v2/app/(tabs)/post.tsx | 33 ++++++++++++++++---------------- client-v2/app/_layout.tsx | 15 ++++++++++----- client-v2/lib/api/upload.ts | 36 ++++++++++++++++++++++++++++------- client-v2/package-lock.json | 25 ++++++++++++++++++++++++ client-v2/package.json | 5 +++-- 5 files changed, 83 insertions(+), 31 deletions(-) diff --git a/client-v2/app/(tabs)/post.tsx b/client-v2/app/(tabs)/post.tsx index 00784ebe..858ac8ed 100644 --- a/client-v2/app/(tabs)/post.tsx +++ b/client-v2/app/(tabs)/post.tsx @@ -3,12 +3,23 @@ import { Text, TouchableOpacity, Image } from "react-native"; import { useState } from "react"; import * as ImagePicker from "expo-image-picker"; import { ImagePickerAsset } from "expo-image-picker"; -import * as Crypto from "expo-crypto"; -import { postCreateUploadUrl } from "@/lib/api/happened"; -import { uploadImage } from "@/lib/api/upload"; + +import { uploadImages } from "@/lib/api/upload"; +import { useMutation } from "@tanstack/react-query"; export default function PostTab() { const [images, setImages] = useState([]); + // Access the client + // const queryClient = useQueryClient(); + + // Queries + const { isPending: isUploadPending, mutateAsync: uploadImagesMutation } = + useMutation({ + mutationFn: uploadImages, + onSuccess: () => console.log("successfully uploaded images"), + onError: (e) => console.error(e), + }); + // uploadImagesMutation.mutate const pickImage = async () => { const result = await ImagePicker.launchImageLibraryAsync({ @@ -42,24 +53,12 @@ export default function PostTab() { { - const imageKey = Crypto.randomUUID(); - const res = await postCreateUploadUrl({ image_key: imageKey }).catch( - console.error, - ); - - if (res) { - console.log("got response"); - - const { method, signed_headers, upload_url } = res.data; - - console.log("data", res.data); - - await uploadImage(upload_url, signed_headers, images[0].uri); - } + uploadImagesMutation(images); }} > Upload Image + {isUploadPending && Uploading {images.length} images...} ); } diff --git a/client-v2/app/_layout.tsx b/client-v2/app/_layout.tsx index e0878324..dd7be791 100644 --- a/client-v2/app/_layout.tsx +++ b/client-v2/app/_layout.tsx @@ -1,9 +1,12 @@ import { Slot } from "expo-router"; import * as SecureStore from "expo-secure-store"; import { ClerkProvider, ClerkLoaded } from "@clerk/clerk-expo"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import "@/global.css"; +const queryClient = new QueryClient(); + export default function RootLayout() { const tokenCache = { async getToken(key: string) { @@ -37,10 +40,12 @@ export default function RootLayout() { } return ( - - - - - + + + + + + + ); } diff --git a/client-v2/lib/api/upload.ts b/client-v2/lib/api/upload.ts index 5d615770..b0b7a5da 100644 --- a/client-v2/lib/api/upload.ts +++ b/client-v2/lib/api/upload.ts @@ -1,13 +1,25 @@ import axios from "axios"; import * as FileSystem from "expo-file-system"; import { Buffer } from "buffer"; +import * as Crypto from "expo-crypto"; +import { postCreateUploadUrl } from "@/lib/api/happened"; +import { ImagePickerAsset } from "expo-image-picker"; +import { ImagePropsAndroid } from "react-native"; -export async function uploadImage( - upload_url: string, - signed_headers: Record, - imageUri: string, -) { - const base64 = await FileSystem.readAsStringAsync(imageUri, { +export async function uploadImage(image: ImagePickerAsset) { + const imageKey = Crypto.randomUUID(); + const res = await postCreateUploadUrl({ image_key: imageKey }).catch( + console.error, + ); + if (!res) { + console.error("no response from post create upload url"); + return; + } + + console.log("got response"); + const { method, signed_headers, upload_url } = res.data; + + const base64 = await FileSystem.readAsStringAsync(image.uri, { encoding: FileSystem.EncodingType.Base64, }); console.log("base64", base64.length); @@ -15,7 +27,6 @@ export async function uploadImage( try { const bytes = new Uint8Array(Buffer.from(base64, "base64")); console.log("uploading image"); - console.log("uploading image"); const resp = await axios.put(upload_url, bytes, { headers: signed_headers, }); @@ -25,3 +36,14 @@ export async function uploadImage( console.error(e); } } + +export async function uploadImages(images: ImagePickerAsset[]) { + const promises = []; + for (const image of images) { + const uploadPromise = uploadImage(image); + promises.push(uploadPromise); + } + + await Promise.all(promises); + console.log("finished uploading all images"); +} diff --git a/client-v2/package-lock.json b/client-v2/package-lock.json index c1c96b69..9f92a23e 100644 --- a/client-v2/package-lock.json +++ b/client-v2/package-lock.json @@ -12,6 +12,7 @@ "@expo/vector-icons": "^14.0.2", "@react-navigation/bottom-tabs": "^7.0.0", "@react-navigation/native": "^7.0.0", + "@tanstack/react-query": "^5.62.3", "axios": "^1.7.7", "expo": "~52.0.11", "expo-blur": "~14.0.1", @@ -4874,6 +4875,30 @@ "tslib": "^2.8.0" } }, + "node_modules/@tanstack/query-core": { + "version": "5.62.3", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.3.tgz", + "integrity": "sha512-Jp/nYoz8cnO7kqhOlSv8ke/0MJRJVGuZ0P/JO9KQ+f45mpN90hrerzavyTKeSoT/pOzeoOUkv1Xd0wPsxAWXfg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.62.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.3.tgz", + "integrity": "sha512-y2zDNKuhgiuMgsKkqd4AcsLIBiCfEO8U11AdrtAUihmLbRNztPrlcZqx2lH1GacZsx+y1qRRbCcJLYTtF1vKsw==", + "dependencies": { + "@tanstack/query-core": "5.62.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", diff --git a/client-v2/package.json b/client-v2/package.json index a8792e26..0d403d80 100644 --- a/client-v2/package.json +++ b/client-v2/package.json @@ -20,6 +20,7 @@ "@expo/vector-icons": "^14.0.2", "@react-navigation/bottom-tabs": "^7.0.0", "@react-navigation/native": "^7.0.0", + "@tanstack/react-query": "^5.62.3", "axios": "^1.7.7", "expo": "~52.0.11", "expo-blur": "~14.0.1", @@ -27,6 +28,7 @@ "expo-dev-client": "~5.0.4", "expo-font": "~13.0.1", "expo-haptics": "~14.0.0", + "expo-image-picker": "~16.0.3", "expo-linking": "~7.0.3", "expo-router": "~4.0.9", "expo-secure-store": "^14.0.0", @@ -47,8 +49,7 @@ "react-native-screens": "~4.1.0", "react-native-web": "~0.19.13", "react-native-webview": "13.12.2", - "tailwindcss": "^3.4.15", - "expo-image-picker": "~16.0.3" + "tailwindcss": "^3.4.15" }, "devDependencies": { "@babel/core": "^7.25.2", From 121d908acd1a574be8b9265dafb64ba3d36f8280 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:17:00 -0800 Subject: [PATCH 6/9] cleanup comments --- client-v2/app/(tabs)/post.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/client-v2/app/(tabs)/post.tsx b/client-v2/app/(tabs)/post.tsx index 858ac8ed..616483f9 100644 --- a/client-v2/app/(tabs)/post.tsx +++ b/client-v2/app/(tabs)/post.tsx @@ -10,8 +10,6 @@ import { useMutation } from "@tanstack/react-query"; export default function PostTab() { const [images, setImages] = useState([]); // Access the client - // const queryClient = useQueryClient(); - // Queries const { isPending: isUploadPending, mutateAsync: uploadImagesMutation } = useMutation({ @@ -19,7 +17,6 @@ export default function PostTab() { onSuccess: () => console.log("successfully uploaded images"), onError: (e) => console.error(e), }); - // uploadImagesMutation.mutate const pickImage = async () => { const result = await ImagePicker.launchImageLibraryAsync({ From 4cae2dbe41ce7377ce9f376e603011e068d88244 Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:18:28 -0800 Subject: [PATCH 7/9] fix CreateUploadURLHandler test --- api/pkg/server/handlers_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api/pkg/server/handlers_test.go b/api/pkg/server/handlers_test.go index d25bd929..9e70b266 100644 --- a/api/pkg/server/handlers_test.go +++ b/api/pkg/server/handlers_test.go @@ -2,10 +2,6 @@ package server_test import ( "fmt" - v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/danielgtaylor/huma/v2/humatest" - "github.com/stretchr/testify/mock" "happenedapi/pkg/images" "happenedapi/pkg/images/mocks" "happenedapi/pkg/server" @@ -13,6 +9,11 @@ import ( "net/http" "testing" + v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/danielgtaylor/huma/v2/humatest" + "github.com/stretchr/testify/mock" + "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -74,10 +75,9 @@ func Test_CreateUploadURLHandler(t *testing.T) { api := server.New(test.MakeLocalDB(t), images.NewService(mockS3PresignClient)) testapi := humatest.Wrap(t, api) - resp := testapi.Get("/create-upload-url", tc.params) + resp := testapi.Post("/create-upload-url", tc.params) assert.Equal(t, tc.expectedStatusCode, resp.Code) - //require.True(t, false, "stop") if !tc.expectedErr { body := test.DecodeAs[server.CreateUploadURLBody](resp.Body, t) assert.Equal(t, tc.expectedMethod, body.Method) From e5cba1aac89a272c6bf329a81c560a82f36c70dd Mon Sep 17 00:00:00 2001 From: Andrew Ho <87453706+anmho@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:19:56 -0800 Subject: [PATCH 8/9] api format --- api/cmd/api/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/cmd/api/main.go b/api/cmd/api/main.go index da996183..d57af414 100644 --- a/api/cmd/api/main.go +++ b/api/cmd/api/main.go @@ -73,7 +73,7 @@ func main() { os.Exit(1) } } - + // Parse env into config var err error var config Config @@ -115,7 +115,6 @@ func main() { os.Exit(1) } - // Setup S3 bucket s3Client := s3.NewFromConfig(cfg) s3PresignClient := s3.NewPresignClient(s3Client) From f1eb38f8cb4ebddb4c0ff11423cb408d0e73b5e9 Mon Sep 17 00:00:00 2001 From: Andrew Ho Date: Thu, 4 Jun 2026 01:30:44 -0700 Subject: [PATCH 9/9] chore: back up local changes before removal --- api/go.sum | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/api/go.sum b/api/go.sum index 7cf951df..2a87a226 100644 --- a/api/go.sum +++ b/api/go.sum @@ -2,10 +2,13 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo= @@ -44,18 +47,46 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 h1:6SZUVRQNvExYlMLbHdlKB48x0fLb github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg= github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/caarlos0/env/v11 v11.2.2 h1:95fApNrUyueipoZN/EhA8mMxiNxrBwDa+oAZrMWl3Kg= github.com/caarlos0/env/v11 v11.2.2/go.mod h1:JBfcdeQiBoI3Zh1QRAWfe+tpiNTmDtcCj/hHHHMx0vc= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/clerk/clerk-sdk-go/v2 v2.2.0 h1:7z2HBQ7L1sW+xVm5LM/bOpzmfhExwa4xgII4fMNFk64= github.com/clerk/clerk-sdk-go/v2 v2.2.0/go.mod h1:tA+JDYh9xEmysBRs+BfJH9HeR0J0HOh8txfsiB115zY= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.1.8/go.mod h1:x6QvFIkMyO2qGIY2zXc88ivEzcbgvLdWjoZyGqDap5U= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/nri v0.6.1/go.mod h1:7+sX3wNx+LR7RzhjnJiUkFDhn18P5Bg/0VnJ/uXpRJM= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.4/go.mod h1:ojvb8SJBSch0XkqNO0L0YX/5NxR3UnVk2LzFKBK0upc= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -63,6 +94,8 @@ github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/danielgtaylor/huma/v2 v2.26.0 h1:lON4pIcckuSQJNDi6WkOu0sS7mxvlNkTAGbc3BrRXTc= github.com/danielgtaylor/huma/v2 v2.26.0/go.mod h1:NbSFXRoOMh3BVmiLJQ9EbUpnPas7D9BeOxF/pZBAGa0= +github.com/danielgtaylor/mexpr v1.9.0/go.mod h1:kAivYNRnBeE/IJinqBvVFvLrX54xX//9zFYwADo4Bc8= +github.com/danielgtaylor/shorthand/v2 v2.2.0/go.mod h1:t5QfaNf7DPru9ZLIIhPQSO7Gyvajm3euw7LxB/MTUqE= 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= @@ -72,10 +105,19 @@ github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+Lnq github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= @@ -87,18 +129,33 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -111,44 +168,76 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= @@ -162,6 +251,7 @@ github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -174,6 +264,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/testcontainers/testcontainers-go/modules/postgres v0.34.0 h1:c51aBXT3v2HEBVarmaBnsKzvgZjC5amn0qsj8Naqi50= @@ -182,17 +274,36 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/uptrace/bunrouter v1.0.22/go.mod h1:O3jAcl+5qgnF+ejhgkmbceEk0E/mqaK+ADOocdNpY8M= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.56.0/go.mod h1:sReBt3XZVnudxuLOx4J/fMrJVorWRiWY2koQKgABiVI= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= @@ -203,6 +314,7 @@ go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -214,6 +326,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -224,6 +337,7 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -272,11 +386,14 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= @@ -288,8 +405,23 @@ google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojt gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= +tags.cncf.io/container-device-interface/specs-go v0.7.0/go.mod h1:hMAwAbMZyBLdmYqWgYcKH0F/yctNpV3P35f+/088A80=