├── Backend
└── HorseSearch
│ ├── obj
│ ├── Debug
│ │ ├── net9.0
│ │ │ ├── HorseSea.26FBD9FC.Up2Date
│ │ │ ├── HorseSearch.MvcApplicationPartsAssemblyInfo.cache
│ │ │ ├── staticwebassets.build.json.cache
│ │ │ ├── staticwebassets.build.endpoints.json
│ │ │ ├── HorseSearch.AssemblyInfoInputs.cache
│ │ │ ├── HorseSearch.genruntimeconfig.cache
│ │ │ ├── HorseSearch.csproj.CoreCompileInputs.cache
│ │ │ ├── apphost.exe
│ │ │ ├── HorseSearch.dll
│ │ │ ├── HorseSearch.pdb
│ │ │ ├── ref
│ │ │ │ └── HorseSearch.dll
│ │ │ ├── HorseSearch.assets.cache
│ │ │ ├── refint
│ │ │ │ └── HorseSearch.dll
│ │ │ ├── staticwebassets
│ │ │ │ ├── msbuild.buildMultiTargeting.HorseSearch.props
│ │ │ │ ├── msbuild.buildTransitive.HorseSearch.props
│ │ │ │ └── msbuild.build.HorseSearch.props
│ │ │ ├── HorseSearch.csproj.AssemblyReference.cache
│ │ │ ├── HorseSearch.sourcelink.json
│ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ ├── staticwebassets.build.json
│ │ │ ├── rpswa.dswa.cache.json
│ │ │ ├── rjsmcshtml.dswa.cache.json
│ │ │ ├── rjsmrazor.dswa.cache.json
│ │ │ ├── HorseSearch.MvcApplicationPartsAssemblyInfo.cs
│ │ │ ├── HorseSearch.GlobalUsings.g.cs
│ │ │ ├── HorseSearch.AssemblyInfo.cs
│ │ │ ├── HorseSearch.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ └── HorseSearch.csproj.FileListAbsolute.txt
│ │ └── net8.0
│ │ │ ├── HorseSearch.AssemblyInfoInputs.cache
│ │ │ ├── HorseSearch.assets.cache
│ │ │ ├── HorseSearch.csproj.AssemblyReference.cache
│ │ │ ├── .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ │ │ ├── HorseSearch.GlobalUsings.g.cs
│ │ │ ├── HorseSearch.AssemblyInfo.cs
│ │ │ └── HorseSearch.GeneratedMSBuildEditorConfig.editorconfig
│ ├── rider.project.restore.info
│ ├── HorseSearch.csproj.nuget.g.targets
│ ├── project.nuget.cache
│ ├── project.packagespec.json
│ ├── HorseSearch.csproj.nuget.g.props
│ ├── HorseSearch.csproj.nuget.dgspec.json
│ └── project.assets.json
│ ├── bin
│ └── Debug
│ │ └── net9.0
│ │ ├── HorseSearch.staticwebassets.endpoints.json
│ │ ├── HorseSearch.dll
│ │ ├── HorseSearch.exe
│ │ ├── HorseSearch.pdb
│ │ ├── HtmlAgilityPack.dll
│ │ ├── Microsoft.OpenApi.dll
│ │ ├── Microsoft.AspNetCore.OpenApi.dll
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ ├── HorseSearch.runtimeconfig.json
│ │ └── HorseSearch.deps.json
│ ├── HorseSearch.http
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── HorseSearch.csproj
│ ├── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── HorseSearch.sln
│ └── Controllers
│ └── HorseSearchControllers.cs
├── Frontend
└── horsesearchfe
│ ├── src
│ ├── react-app-env.d.ts
│ ├── setupTests.ts
│ ├── App.test.tsx
│ ├── index.css
│ ├── reportWebVitals.ts
│ ├── index.tsx
│ ├── App.css
│ ├── logo.svg
│ └── App.tsx
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── .gitignore
│ ├── tsconfig.json
│ ├── package.json
│ └── README.md
├── .gitignore.txt
├── README.md.txt
├── HorseSearch.sln
└── .github
└── workflows
├── main_horse-search-api.yml
└── azure-static-web-apps-proud-hill-07c653603.yml
/Backend/HorseSearch/obj/Debug/net9.0/HorseSea.26FBD9FC.Up2Date:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/rider.project.restore.info:
--------------------------------------------------------------------------------
1 | 17552906006231887
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.MvcApplicationPartsAssemblyInfo.cache:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/react-app-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets.build.json.cache:
--------------------------------------------------------------------------------
1 | nRQBAcgodun08ghoidmSU0b3t7lQnTp8jVCGiT8dy8g=
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets.build.endpoints.json:
--------------------------------------------------------------------------------
1 | {"Version":1,"ManifestType":"Build","Endpoints":[]}
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.staticwebassets.endpoints.json:
--------------------------------------------------------------------------------
1 | {"Version":1,"ManifestType":"Build","Endpoints":[]}
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Frontend/horsesearchfe/public/favicon.ico
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Frontend/horsesearchfe/public/logo192.png
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Frontend/horsesearchfe/public/logo512.png
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.AssemblyInfoInputs.cache:
--------------------------------------------------------------------------------
1 | 5d0440408a0bf26bb3b0429ee609f031923d73a66751304637abdef97c9f3e88
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.AssemblyInfoInputs.cache:
--------------------------------------------------------------------------------
1 | 37ec6c4c7396ed4e36f67390705cf3f62705e5aa7f09e8b36b63099e192ccd8d
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.genruntimeconfig.cache:
--------------------------------------------------------------------------------
1 | dbbf181f91336cafca30bbfbc5765555f94e7e6f8a4eecdf58d83803a8445af1
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.csproj.CoreCompileInputs.cache:
--------------------------------------------------------------------------------
1 | 5591f6d6bca904cd7d1a3f9c4772388bf0fe5ea5022b74dac569f3b469dc70c0
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/apphost.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/apphost.exe
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.exe
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.pdb
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.pdb
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HtmlAgilityPack.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/HtmlAgilityPack.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/ref/HorseSearch.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/ref/HorseSearch.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/Microsoft.OpenApi.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/Microsoft.OpenApi.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.assets.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.assets.cache
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.assets.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.assets.cache
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/refint/HorseSearch.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/refint/HorseSearch.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets/msbuild.buildMultiTargeting.HorseSearch.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets/msbuild.buildTransitive.HorseSearch.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/HorseSearch.http:
--------------------------------------------------------------------------------
1 | @HorseSearch_HostAddress = http://localhost:5062
2 |
3 | GET {{HorseSearch_HostAddress}}/weatherforecast/
4 | Accept: application/json
5 |
6 | ###
7 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/Microsoft.AspNetCore.OpenApi.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/bin/Debug/net9.0/Microsoft.AspNetCore.OpenApi.dll
--------------------------------------------------------------------------------
/Backend/HorseSearch/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/HorseSearch.csproj.nuget.g.targets:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.csproj.AssemblyReference.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.csproj.AssemblyReference.cache
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.csproj.AssemblyReference.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/examine/Horse-Search/main/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.csproj.AssemblyReference.cache
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.sourcelink.json:
--------------------------------------------------------------------------------
1 | {"documents":{"C:\\Appl\\GITHUB\\Horse-Search\\*":"https://raw.githubusercontent.com/examine/Horse-Search/8101b95f6f57052bfd496ba2ef8adeb6fc586390/*"}}
--------------------------------------------------------------------------------
/Backend/HorseSearch/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | },
8 | "AllowedHosts": "*"
9 | }
10 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | },
8 | "AllowedHosts": "*"
9 | }
10 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets/msbuild.build.HorseSearch.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs:
--------------------------------------------------------------------------------
1 | //
2 | using System;
3 | using System.Reflection;
4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
5 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:
--------------------------------------------------------------------------------
1 | //
2 | using System;
3 | using System.Reflection;
4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
5 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/setupTests.ts:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/staticwebassets.build.json:
--------------------------------------------------------------------------------
1 | {"Version":1,"Hash":"nRQBAcgodun08ghoidmSU0b3t7lQnTp8jVCGiT8dy8g=","Source":"HorseSearch","BasePath":"_content/HorseSearch","Mode":"Default","ManifestType":"Build","ReferencedProjectsConfiguration":[],"DiscoveryPatterns":[],"Assets":[],"Endpoints":[]}
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/App.test.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render, screen } from '@testing-library/react';
3 | import App from './App';
4 |
5 | test('renders learn react link', () => {
6 | render();
7 | const linkElement = screen.getByText(/learn react/i);
8 | expect(linkElement).toBeInTheDocument();
9 | });
10 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/rpswa.dswa.cache.json:
--------------------------------------------------------------------------------
1 | {"GlobalPropertiesHash":"32S4usF1PXxgGOjelrvylren0UpVTsjqQzYvG0EiUvQ=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["czHOEoosIrGTkGxHRrguPs6eYdWCifgcsRycYshVWK4=","X4sb3iMk2A4EucboKUE7mBjwXyA01eGdRcGHMl3k4bA="],"CachedAssets":{},"CachedCopyCandidates":{}}
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/HorseSearch.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.gitignore.txt:
--------------------------------------------------------------------------------
1 | # Node modules (frontend)
2 | horse-search-frontend/node_modules/
3 |
4 | # build output
5 | horse-search-frontend/build/
6 | horse-search-frontend/dist/
7 |
8 | # environment variables
9 | horse-search-frontend/.env
10 |
11 | # logs
12 | *.log
13 |
14 | # VS Code
15 | .vscode/
16 |
17 | # .NET build artifacts (backend)
18 | HorseSearchApi/bin/
19 | HorseSearchApi/obj/
20 |
21 | # User-specific files
22 | *.user
23 | *.suo
24 | *.userosscache
25 | *.sln.docstates
26 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/reportWebVitals.ts:
--------------------------------------------------------------------------------
1 | import { ReportHandler } from 'web-vitals';
2 |
3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => {
4 | if (onPerfEntry && onPerfEntry instanceof Function) {
5 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
6 | getCLS(onPerfEntry);
7 | getFID(onPerfEntry);
8 | getFCP(onPerfEntry);
9 | getLCP(onPerfEntry);
10 | getTTFB(onPerfEntry);
11 | });
12 | }
13 | };
14 |
15 | export default reportWebVitals;
16 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.runtimeconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "runtimeOptions": {
3 | "tfm": "net9.0",
4 | "frameworks": [
5 | {
6 | "name": "Microsoft.NETCore.App",
7 | "version": "9.0.0"
8 | },
9 | {
10 | "name": "Microsoft.AspNetCore.App",
11 | "version": "9.0.0"
12 | }
13 | ],
14 | "configProperties": {
15 | "System.GC.Server": true,
16 | "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/rjsmcshtml.dswa.cache.json:
--------------------------------------------------------------------------------
1 | {"GlobalPropertiesHash":"jk2V6KR5UN4WocfrvKPodhrpJXq93viuD8KDvh/YhL0=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["czHOEoosIrGTkGxHRrguPs6eYdWCifgcsRycYshVWK4=","X4sb3iMk2A4EucboKUE7mBjwXyA01eGdRcGHMl3k4bA=","Ui0JTzDuOkJ39djpDiucQEgGyuBkYBFoHBKX8MrDoUM=","oRXUIwKI93UoUkDQ/oWjKuYI0wxy142BCMAjTO4nqf0=","IttOnmitAqw4uYkJngmiZ2Rnyw4es1Cx\u002BjB9MmpGGBk="],"CachedAssets":{},"CachedCopyCandidates":{}}
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/rjsmrazor.dswa.cache.json:
--------------------------------------------------------------------------------
1 | {"GlobalPropertiesHash":"0KLOKHe+8kJuHQlfq1pklY7d/kM/HnMVtjw3FjNUwcY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["czHOEoosIrGTkGxHRrguPs6eYdWCifgcsRycYshVWK4=","X4sb3iMk2A4EucboKUE7mBjwXyA01eGdRcGHMl3k4bA=","Ui0JTzDuOkJ39djpDiucQEgGyuBkYBFoHBKX8MrDoUM=","oRXUIwKI93UoUkDQ/oWjKuYI0wxy142BCMAjTO4nqf0=","IttOnmitAqw4uYkJngmiZ2Rnyw4es1Cx\u002BjB9MmpGGBk="],"CachedAssets":{},"CachedCopyCandidates":{}}
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/project.nuget.cache:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "dgSpecHash": "+x2xDEYb3AA=",
4 | "success": true,
5 | "projectFilePath": "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj",
6 | "expectedPackageFiles": [
7 | "C:\\Users\\vhor\\.nuget\\packages\\htmlagilitypack\\1.11.45\\htmlagilitypack.1.11.45.nupkg.sha512",
8 | "C:\\Users\\vhor\\.nuget\\packages\\microsoft.aspnetcore.openapi\\8.0.8\\microsoft.aspnetcore.openapi.8.0.8.nupkg.sha512",
9 | "C:\\Users\\vhor\\.nuget\\packages\\microsoft.openapi\\1.4.3\\microsoft.openapi.1.4.3.nupkg.sha512"
10 | ],
11 | "logs": []
12 | }
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | const root = ReactDOM.createRoot(
8 | document.getElementById('root') as HTMLElement
9 | );
10 | root.render(
11 |
12 |
13 |
14 | );
15 |
16 | // If you want to start measuring performance in your app, pass a function
17 | // to log results (for example: reportWebVitals(console.log))
18 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
19 | reportWebVitals();
20 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": [
5 | "dom",
6 | "dom.iterable",
7 | "esnext"
8 | ],
9 | "allowJs": true,
10 | "skipLibCheck": true,
11 | "esModuleInterop": true,
12 | "allowSyntheticDefaultImports": true,
13 | "strict": true,
14 | "forceConsistentCasingInFileNames": true,
15 | "noFallthroughCasesInSwitch": true,
16 | "module": "esnext",
17 | "moduleResolution": "node",
18 | "resolveJsonModule": true,
19 | "isolatedModules": true,
20 | "noEmit": true,
21 | "jsx": "react-jsx"
22 | },
23 | "include": [
24 | "src"
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/Program.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.Extensions.DependencyInjection;
3 | using Microsoft.Extensions.Hosting;
4 |
5 | var builder = WebApplication.CreateBuilder(args);
6 |
7 | builder.Services.AddControllers();
8 | builder.Services.AddCors(options =>
9 | {
10 | options.AddDefaultPolicy(policy =>
11 | {
12 | policy.AllowAnyOrigin()
13 | .AllowAnyHeader()
14 | .AllowAnyMethod();
15 | });
16 | });
17 |
18 | var app = builder.Build();
19 |
20 | app.UseCors();
21 | app.UseRouting();
22 | app.UseEndpoints(endpoints =>
23 | {
24 | endpoints.MapControllers();
25 | });
26 |
27 | app.Run();
28 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.MvcApplicationPartsAssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | using System;
11 | using System.Reflection;
12 |
13 | [assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartAttribute("Microsoft.AspNetCore.OpenApi")]
14 |
15 | // Generated by the MSBuild WriteCodeFragment class.
16 |
17 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/launchsettings.json",
3 | "profiles": {
4 | "http": {
5 | "commandName": "Project",
6 | "dotnetRunMessages": true,
7 | "launchBrowser": false,
8 | "applicationUrl": "http://localhost:5000",
9 | "environmentVariables": {
10 | "ASPNETCORE_ENVIRONMENT": "Development"
11 | }
12 | },
13 | "https": {
14 | "commandName": "Project",
15 | "dotnetRunMessages": true,
16 | "launchBrowser": false,
17 | "applicationUrl": "https://localhost:7151;http://localhost:5062",
18 | "environmentVariables": {
19 | "ASPNETCORE_ENVIRONMENT": "Development"
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.GlobalUsings.g.cs:
--------------------------------------------------------------------------------
1 | //
2 | global using global::Microsoft.AspNetCore.Builder;
3 | global using global::Microsoft.AspNetCore.Hosting;
4 | global using global::Microsoft.AspNetCore.Http;
5 | global using global::Microsoft.AspNetCore.Routing;
6 | global using global::Microsoft.Extensions.Configuration;
7 | global using global::Microsoft.Extensions.DependencyInjection;
8 | global using global::Microsoft.Extensions.Hosting;
9 | global using global::Microsoft.Extensions.Logging;
10 | global using global::System;
11 | global using global::System.Collections.Generic;
12 | global using global::System.IO;
13 | global using global::System.Linq;
14 | global using global::System.Net.Http;
15 | global using global::System.Net.Http.Json;
16 | global using global::System.Threading;
17 | global using global::System.Threading.Tasks;
18 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.GlobalUsings.g.cs:
--------------------------------------------------------------------------------
1 | //
2 | global using global::Microsoft.AspNetCore.Builder;
3 | global using global::Microsoft.AspNetCore.Hosting;
4 | global using global::Microsoft.AspNetCore.Http;
5 | global using global::Microsoft.AspNetCore.Routing;
6 | global using global::Microsoft.Extensions.Configuration;
7 | global using global::Microsoft.Extensions.DependencyInjection;
8 | global using global::Microsoft.Extensions.Hosting;
9 | global using global::Microsoft.Extensions.Logging;
10 | global using global::System;
11 | global using global::System.Collections.Generic;
12 | global using global::System.IO;
13 | global using global::System.Linq;
14 | global using global::System.Net.Http;
15 | global using global::System.Net.Http.Json;
16 | global using global::System.Threading;
17 | global using global::System.Threading.Tasks;
18 |
--------------------------------------------------------------------------------
/README.md.txt:
--------------------------------------------------------------------------------
1 | # Horse Search
2 |
3 | This project allows users to search for horse racing startlists by horse name.
4 |
5 | ## 📦 Structure
6 |
7 | - **horse-search-frontend/** – React + TypeScript frontend
8 | - **HorseSearchApi/** – .NET 9 Web API backend
9 | - **HorseSearchSolution.sln** – .NET solution file
10 |
11 | ## 🚀 Getting Started
12 |
13 | ### Backend (.NET)
14 |
15 | ```bash
16 | cd HorseSearchApi
17 | dotnet run
18 |
19 | ### Frontend (React)
20 | cd horse-search-frontend
21 | npm install
22 | npm start
23 |
24 | Make sure the backend runs on https://localhost:5000 and that the frontend has this in package.json:
25 | "proxy": "http://localhost:5000"
26 |
27 | 🔍 Search Example
28 | Enter a horse name (e.g. Just Like Heaven) and press Search. If found in any startlist within 7 days, results will appear.
29 |
30 | 🛠 Tech Stack
31 | React + TypeScript
32 |
33 | .NET 9 Web API
34 |
35 | HtmlAgilityPack (for HTML scraping)
36 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | using System;
11 | using System.Reflection;
12 |
13 | [assembly: System.Reflection.AssemblyCompanyAttribute("HorseSearch")]
14 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
15 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
16 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6bb4f4215ea7261c7480a5a9f55073d105468e11")]
17 | [assembly: System.Reflection.AssemblyProductAttribute("HorseSearch")]
18 | [assembly: System.Reflection.AssemblyTitleAttribute("HorseSearch")]
19 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
20 |
21 | // Generated by the MSBuild WriteCodeFragment class.
22 |
23 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | //
5 | // Changes to this file may cause incorrect behavior and will be lost if
6 | // the code is regenerated.
7 | //
8 | //------------------------------------------------------------------------------
9 |
10 | using System;
11 | using System.Reflection;
12 |
13 | [assembly: System.Reflection.AssemblyCompanyAttribute("HorseSearch")]
14 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
15 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
16 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8101b95f6f57052bfd496ba2ef8adeb6fc586390")]
17 | [assembly: System.Reflection.AssemblyProductAttribute("HorseSearch")]
18 | [assembly: System.Reflection.AssemblyTitleAttribute("HorseSearch")]
19 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
20 |
21 | // Generated by the MSBuild WriteCodeFragment class.
22 |
23 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net8.0/HorseSearch.GeneratedMSBuildEditorConfig.editorconfig:
--------------------------------------------------------------------------------
1 | is_global = true
2 | build_property.TargetFramework = net8.0
3 | build_property.TargetPlatformMinVersion =
4 | build_property.UsingMicrosoftNETSdkWeb = true
5 | build_property.ProjectTypeGuids =
6 | build_property.InvariantGlobalization =
7 | build_property.PlatformNeutralAssembly =
8 | build_property.EnforceExtendedAnalyzerRules =
9 | build_property._SupportedPlatformList = Linux,macOS,Windows
10 | build_property.RootNamespace = HorseSearch
11 | build_property.RootNamespace = HorseSearch
12 | build_property.ProjectDir = c:\Appl\GITHUB\Horse-Search\Backend\HorseSearch\
13 | build_property.EnableComHosting =
14 | build_property.EnableGeneratedComInterfaceComImportInterop =
15 | build_property.RazorLangVersion = 8.0
16 | build_property.SupportLocalizedComponentNames =
17 | build_property.GenerateRazorMetadataSourceChecksumAttributes =
18 | build_property.MSBuildProjectDirectory = c:\Appl\GITHUB\Horse-Search\Backend\HorseSearch
19 | build_property._RazorSourceGeneratorDebug =
20 | build_property.EffectiveAnalysisLevelStyle = 8.0
21 | build_property.EnableCodeStyleSeverity =
22 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/Debug/net9.0/HorseSearch.GeneratedMSBuildEditorConfig.editorconfig:
--------------------------------------------------------------------------------
1 | is_global = true
2 | build_property.TargetFramework = net9.0
3 | build_property.TargetPlatformMinVersion =
4 | build_property.UsingMicrosoftNETSdkWeb = true
5 | build_property.ProjectTypeGuids =
6 | build_property.InvariantGlobalization =
7 | build_property.PlatformNeutralAssembly =
8 | build_property.EnforceExtendedAnalyzerRules =
9 | build_property._SupportedPlatformList = Linux,macOS,Windows
10 | build_property.RootNamespace = HorseSearch
11 | build_property.RootNamespace = HorseSearch
12 | build_property.ProjectDir = C:\Appl\GITHUB\Horse-Search\Backend\HorseSearch\
13 | build_property.EnableComHosting =
14 | build_property.EnableGeneratedComInterfaceComImportInterop =
15 | build_property.RazorLangVersion = 9.0
16 | build_property.SupportLocalizedComponentNames =
17 | build_property.GenerateRazorMetadataSourceChecksumAttributes =
18 | build_property.MSBuildProjectDirectory = C:\Appl\GITHUB\Horse-Search\Backend\HorseSearch
19 | build_property._RazorSourceGeneratorDebug =
20 | build_property.EffectiveAnalysisLevelStyle = 9.0
21 | build_property.EnableCodeStyleSeverity =
22 |
--------------------------------------------------------------------------------
/HorseSearch.sln:
--------------------------------------------------------------------------------
1 | Microsoft Visual Studio Solution File, Format Version 12.00
2 | # Visual Studio Version 17
3 | VisualStudioVersion = 17.5.2.0
4 | MinimumVisualStudioVersion = 10.0.40219.1
5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HorseSearch", "HorseSearch.csproj", "{1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}"
6 | EndProject
7 | Global
8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
9 | Debug|Any CPU = Debug|Any CPU
10 | Release|Any CPU = Release|Any CPU
11 | EndGlobalSection
12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
13 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
15 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
16 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Release|Any CPU.Build.0 = Release|Any CPU
17 | EndGlobalSection
18 | GlobalSection(SolutionProperties) = preSolution
19 | HideSolutionNode = FALSE
20 | EndGlobalSection
21 | GlobalSection(ExtensibilityGlobals) = postSolution
22 | SolutionGuid = {594C6832-9660-4421-AF88-91DEE0E11B5F}
23 | EndGlobalSection
24 | EndGlobal
25 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/HorseSearch.sln:
--------------------------------------------------------------------------------
1 | Microsoft Visual Studio Solution File, Format Version 12.00
2 | # Visual Studio Version 17
3 | VisualStudioVersion = 17.5.2.0
4 | MinimumVisualStudioVersion = 10.0.40219.1
5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HorseSearch", "HorseSearch.csproj", "{1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}"
6 | EndProject
7 | Global
8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
9 | Debug|Any CPU = Debug|Any CPU
10 | Release|Any CPU = Release|Any CPU
11 | EndGlobalSection
12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
13 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
15 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
16 | {1D309FFC-8AD9-DA39-BFDD-DB3E51F654B1}.Release|Any CPU.Build.0 = Release|Any CPU
17 | EndGlobalSection
18 | GlobalSection(SolutionProperties) = preSolution
19 | HideSolutionNode = FALSE
20 | EndGlobalSection
21 | GlobalSection(ExtensibilityGlobals) = postSolution
22 | SolutionGuid = {594C6832-9660-4421-AF88-91DEE0E11B5F}
23 | EndGlobalSection
24 | EndGlobal
25 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "horsesearchfe",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/dom": "^10.4.0",
7 | "@testing-library/jest-dom": "^6.6.3",
8 | "@testing-library/react": "^16.3.0",
9 | "@testing-library/user-event": "^13.5.0",
10 | "@types/jest": "^27.5.2",
11 | "@types/node": "^16.18.126",
12 | "@types/react": "^19.1.8",
13 | "@types/react-dom": "^19.1.6",
14 | "react": "^19.1.0",
15 | "react-dom": "^19.1.0",
16 | "react-scripts": "5.0.1",
17 | "typescript": "^4.9.5",
18 | "web-vitals": "^2.1.4"
19 | },
20 | "proxy": "http://localhost:5000",
21 |
22 | "scripts": {
23 | "start": "react-scripts start",
24 | "build": "react-scripts build",
25 | "test": "react-scripts test",
26 | "eject": "react-scripts eject"
27 | },
28 | "eslintConfig": {
29 | "extends": [
30 | "react-app",
31 | "react-app/jest"
32 | ]
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/project.packagespec.json:
--------------------------------------------------------------------------------
1 | "restore":{"projectUniqueName":"c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj","projectName":"HorseSearch","projectPath":"c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj","outputPath":"c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net8.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"HtmlAgilityPack":{"target":"Package","version":"[1.11.45, )"},"Microsoft.AspNetCore.OpenApi":{"target":"Package","version":"[8.0.8, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json"}}
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/HorseSearch.csproj.nuget.g.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | True
5 | NuGet
6 | $(MSBuildThisFileDirectory)project.assets.json
7 | $(UserProfile)\.nuget\packages\
8 | C:\Users\vhor\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
9 | PackageReference
10 | 6.14.0
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/.github/workflows/main_horse-search-api.yml:
--------------------------------------------------------------------------------
1 | # Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
2 | # More GitHub Actions for Azure: https://github.com/Azure/actions
3 |
4 | name: Build and deploy ASP.Net Core app to Azure Web App - horse-search-api
5 |
6 | on:
7 | push:
8 | branches:
9 | - main
10 | workflow_dispatch:
11 |
12 | jobs:
13 | build:
14 | runs-on: windows-latest
15 | permissions:
16 | contents: read #This is required for actions/checkout
17 |
18 | steps:
19 | - uses: actions/checkout@v4
20 |
21 | - name: Set up .NET Core
22 | uses: actions/setup-dotnet@v4
23 | with:
24 | dotnet-version: '8.x'
25 |
26 | - name: Build with dotnet
27 | run: dotnet build --configuration Release
28 |
29 | - name: dotnet publish
30 | run: dotnet publish -c Release -o "${{env.DOTNET_ROOT}}/myapp"
31 |
32 | - name: Upload artifact for deployment job
33 | uses: actions/upload-artifact@v4
34 | with:
35 | name: .net-app
36 | path: ${{env.DOTNET_ROOT}}/myapp
37 |
38 | deploy:
39 | runs-on: windows-latest
40 | needs: build
41 | permissions:
42 | id-token: write #This is required for requesting the JWT
43 | contents: read #This is required for actions/checkout
44 |
45 | steps:
46 | - name: Download artifact from build job
47 | uses: actions/download-artifact@v4
48 | with:
49 | name: .net-app
50 |
51 | - name: Login to Azure
52 | uses: azure/login@v2
53 | with:
54 | client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_9D14909228084B3BB3A10EB2943F54F8 }}
55 | tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_342D9116B91841D8A4081391BD2BE39F }}
56 | subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_C11B4A0A9C7A4941A948127F9C16BAA9 }}
57 |
58 | - name: Deploy to Azure Web App
59 | id: deploy-to-webapp
60 | uses: azure/webapps-deploy@v3
61 | with:
62 | app-name: 'horse-search-api'
63 | slot-name: 'Production'
64 | package: .
65 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
13 |
14 | The page will reload if you make edits.\
15 | You will also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
35 |
36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
39 |
40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
--------------------------------------------------------------------------------
/.github/workflows/azure-static-web-apps-proud-hill-07c653603.yml:
--------------------------------------------------------------------------------
1 | name: Azure Static Web Apps CI/CD
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | pull_request:
8 | types: [opened, synchronize, reopened, closed]
9 | branches:
10 | - main
11 |
12 | jobs:
13 | build_and_deploy_job:
14 | if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
15 | runs-on: ubuntu-latest
16 | name: Build and Deploy Job
17 | permissions:
18 | id-token: write
19 | contents: read
20 | steps:
21 | - uses: actions/checkout@v3
22 | with:
23 | submodules: true
24 | lfs: false
25 | - name: Install OIDC Client from Core Package
26 | run: npm install @actions/core@1.6.0 @actions/http-client
27 | - name: Get Id Token
28 | uses: actions/github-script@v6
29 | id: idtoken
30 | with:
31 | script: |
32 | const coredemo = require('@actions/core')
33 | return await coredemo.getIDToken()
34 | result-encoding: string
35 | - name: Build And Deploy
36 | id: builddeploy
37 | uses: Azure/static-web-apps-deploy@v1
38 | with:
39 | azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_HILL_07C653603 }}
40 | action: "upload"
41 | ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
42 | # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
43 | app_location: "Frontend/horsesearchfe" # App source code path
44 | api_location: "" # Api source code path - optional
45 | output_location: "build" # Built app content directory - optional
46 | github_id_token: ${{ steps.idtoken.outputs.result }}
47 | ###### End of Repository/Build Configurations ######
48 |
49 | close_pull_request_job:
50 | if: github.event_name == 'pull_request' && github.event.action == 'closed'
51 | runs-on: ubuntu-latest
52 | name: Close Pull Request Job
53 | steps:
54 | - name: Close Pull Request
55 | id: closepullrequest
56 | uses: Azure/static-web-apps-deploy@v1
57 | with:
58 | action: "close"
59 |
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/bin/Debug/net9.0/HorseSearch.deps.json:
--------------------------------------------------------------------------------
1 | {
2 | "runtimeTarget": {
3 | "name": ".NETCoreApp,Version=v9.0",
4 | "signature": ""
5 | },
6 | "compilationOptions": {},
7 | "targets": {
8 | ".NETCoreApp,Version=v9.0": {
9 | "HorseSearch/1.0.0": {
10 | "dependencies": {
11 | "HtmlAgilityPack": "1.11.45",
12 | "Microsoft.AspNetCore.OpenApi": "9.0.6"
13 | },
14 | "runtime": {
15 | "HorseSearch.dll": {}
16 | }
17 | },
18 | "HtmlAgilityPack/1.11.45": {
19 | "runtime": {
20 | "lib/netstandard2.0/HtmlAgilityPack.dll": {
21 | "assemblyVersion": "1.11.45.0",
22 | "fileVersion": "1.11.45.0"
23 | }
24 | }
25 | },
26 | "Microsoft.AspNetCore.OpenApi/9.0.6": {
27 | "dependencies": {
28 | "Microsoft.OpenApi": "1.6.17"
29 | },
30 | "runtime": {
31 | "lib/net9.0/Microsoft.AspNetCore.OpenApi.dll": {
32 | "assemblyVersion": "9.0.6.0",
33 | "fileVersion": "9.0.625.26701"
34 | }
35 | }
36 | },
37 | "Microsoft.OpenApi/1.6.17": {
38 | "runtime": {
39 | "lib/netstandard2.0/Microsoft.OpenApi.dll": {
40 | "assemblyVersion": "1.6.17.0",
41 | "fileVersion": "1.6.17.0"
42 | }
43 | }
44 | }
45 | }
46 | },
47 | "libraries": {
48 | "HorseSearch/1.0.0": {
49 | "type": "project",
50 | "serviceable": false,
51 | "sha512": ""
52 | },
53 | "HtmlAgilityPack/1.11.45": {
54 | "type": "package",
55 | "serviceable": true,
56 | "sha512": "sha512-adcQUl0CTUJuOVb365DEVxAs7z36AjUU/3JCq65DuYRFJ/+Fsd99MxpkiE9xwelYAcsD0cFlOKI2FXhxSoA3iw==",
57 | "path": "htmlagilitypack/1.11.45",
58 | "hashPath": "htmlagilitypack.1.11.45.nupkg.sha512"
59 | },
60 | "Microsoft.AspNetCore.OpenApi/9.0.6": {
61 | "type": "package",
62 | "serviceable": true,
63 | "sha512": "sha512-MOJ4DG1xd3NlWMYh+JdGNT9uvBtEk1XQU/FQlpNZFlAzM8t0oB5IimvnGlnK7jmyY4vQagLPB1xw1HjJ8CHrZg==",
64 | "path": "microsoft.aspnetcore.openapi/9.0.6",
65 | "hashPath": "microsoft.aspnetcore.openapi.9.0.6.nupkg.sha512"
66 | },
67 | "Microsoft.OpenApi/1.6.17": {
68 | "type": "package",
69 | "serviceable": true,
70 | "sha512": "sha512-Le+kehlmrlQfuDFUt1zZ2dVwrhFQtKREdKBo+rexOwaCoYP0/qpgT9tLxCsZjsgR5Itk1UKPcbgO+FyaNid/bA==",
71 | "path": "microsoft.openapi/1.6.17",
72 | "hashPath": "microsoft.openapi.1.6.17.nupkg.sha512"
73 | }
74 | }
75 | }
--------------------------------------------------------------------------------
/Frontend/horsesearchfe/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 |
3 | interface SearchResult {
4 | date: string;
5 | track: string;
6 | url: string;
7 | }
8 |
9 | const App: React.FC = () => {
10 | const [horseName, setHorseName] = useState("");
11 | const [results, setResults] = useState([]);
12 | const [loading, setLoading] = useState(false);
13 | const [error, setError] = useState("");
14 |
15 | const handleSearch = async () => {
16 | setLoading(true);
17 | setError("");
18 | setResults([]);
19 |
20 | try {
21 | // const response = await fetch(
22 | // `https://horse-search-api.azurewebsites.net/api/search?horseName=${encodeURIComponent(horseName)}`
23 | // );
24 |
25 | const response = await fetch(
26 | `https://horse-search-api.azurewebsites.net/api/search?horseName=${encodeURIComponent(horseName)}`
27 | );
28 |
29 | if (!response.ok) {
30 | throw new Error("Search failed");
31 | }
32 |
33 | const data = await response.json();
34 | setResults(data);
35 | } catch (err) {
36 | setError("Failed to fetch search results.");
37 | } finally {
38 | setLoading(false);
39 | }
40 | };
41 |
42 | return (
43 |
44 |
Horse Startlist Search
45 |
46 |
setHorseName(e.target.value)}
50 | placeholder="Enter horse name"
51 | style={{ width: "100%", padding: "0.5rem", marginBottom: "1rem" }}
52 | />
53 |
60 |
61 | {error &&
{error}
}
62 |
63 | {results.length > 0 && (
64 |
65 |
Results:
66 |
67 | {results.map((result, index) => (
68 | -
77 | Date: {result.date}
78 | Track: {result.track}
79 |
80 | View Startlist
81 |
82 |
83 | ))}
84 |
85 |
86 | )}
87 |
88 | );
89 | };
90 |
91 | export default App;
92 |
--------------------------------------------------------------------------------
/Backend/HorseSearch/obj/HorseSearch.csproj.nuget.dgspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "format": 1,
3 | "restore": {
4 | "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj": {}
5 | },
6 | "projects": {
7 | "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj": {
8 | "version": "1.0.0",
9 | "restore": {
10 | "projectUniqueName": "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj",
11 | "projectName": "HorseSearch",
12 | "projectPath": "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\HorseSearch.csproj",
13 | "packagesPath": "C:\\Users\\vhor\\.nuget\\packages\\",
14 | "outputPath": "c:\\Appl\\GITHUB\\Horse-Search\\Backend\\HorseSearch\\obj\\",
15 | "projectStyle": "PackageReference",
16 | "fallbackFolders": [
17 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
18 | ],
19 | "configFilePaths": [
20 | "C:\\Users\\vhor\\AppData\\Roaming\\NuGet\\NuGet.Config",
21 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
22 | "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
23 | ],
24 | "originalTargetFrameworks": [
25 | "net8.0"
26 | ],
27 | "sources": {
28 | "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
29 | "https://api.nuget.org/v3/index.json": {}
30 | },
31 | "frameworks": {
32 | "net8.0": {
33 | "targetAlias": "net8.0",
34 | "projectReferences": {}
35 | }
36 | },
37 | "warningProperties": {
38 | "warnAsError": [
39 | "NU1605"
40 | ]
41 | },
42 | "restoreAuditProperties": {
43 | "enableAudit": "true",
44 | "auditLevel": "low",
45 | "auditMode": "direct"
46 | },
47 | "SdkAnalysisLevel": "9.0.300"
48 | },
49 | "frameworks": {
50 | "net8.0": {
51 | "targetAlias": "net8.0",
52 | "dependencies": {
53 | "HtmlAgilityPack": {
54 | "target": "Package",
55 | "version": "[1.11.45, )"
56 | },
57 | "Microsoft.AspNetCore.OpenApi": {
58 | "target": "Package",
59 | "version": "[8.0.8, )"
60 | }
61 | },
62 | "imports": [
63 | "net461",
64 | "net462",
65 | "net47",
66 | "net471",
67 | "net472",
68 | "net48",
69 | "net481"
70 | ],
71 | "assetTargetFallback": true,
72 | "warn": true,
73 | "frameworkReferences": {
74 | "Microsoft.AspNetCore.App": {
75 | "privateAssets": "none"
76 | },
77 | "Microsoft.NETCore.App": {
78 | "privateAssets": "all"
79 | }
80 | },
81 | "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json"
82 | }
83 | }
84 | }
85 | }
86 | }
--------------------------------------------------------------------------------
/Backend/HorseSearch/Controllers/HorseSearchControllers.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Net.Http;
5 | using System.Threading.Tasks;
6 | using HtmlAgilityPack;
7 |
8 | namespace HorseSearchApi.Controllers
9 | {
10 | [ApiController]
11 | [Route("api/[controller]")]
12 | public class SearchController : ControllerBase
13 | {
14 | private static readonly List TrackSlugs = new()
15 | {
16 | "bergen-travpark", "biri-travbane", "bjerke-travbane", "forus-travbane",
17 | "harstad-travpark", "jarlsberg-travbane", "klosterskogen-travbane", "varig-orkla-arena",
18 | "momarken-travbane", "sorlandets-travpark", "ovrevoll-galopp", "bodo-travbane",
19 | "nossum-travbane", "kala-travpark", "lofoten-travpark", "magnor-travbane",
20 | "mo-travpark", "skoglund-travbane", "kongsvinger-travbane"
21 | };
22 |
23 | [HttpGet]
24 | public async Task Get([FromQuery] string horseName)
25 | {
26 | if (string.IsNullOrWhiteSpace(horseName))
27 | return BadRequest("Horse name is required.");
28 |
29 | var results = new List