{"id":15192331,"url":"https://github.com/the-katsu/rickandmortywiki","last_synced_at":"2026-03-02T22:32:04.850Z","repository":{"id":169880263,"uuid":"600882758","full_name":"The-Katsu/RickAndMortyWiki","owner":"The-Katsu","description":"net 7, Blazor WASM, GraphQL.Client","archived":false,"fork":false,"pushed_at":"2023-03-01T19:51:58.000Z","size":24818,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"release","last_synced_at":"2025-01-11T08:48:25.207Z","etag":null,"topics":["blazor","blazor-wasm","blazor-webassembly","csharp","docker","docker-compose","graphql","graphql-client","net7"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/The-Katsu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-12T21:40:55.000Z","updated_at":"2023-02-14T00:15:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"7d780225-d9bd-4042-80e1-f8f7a7f07465","html_url":"https://github.com/The-Katsu/RickAndMortyWiki","commit_stats":{"total_commits":15,"total_committers":2,"mean_commits":7.5,"dds":0.1333333333333333,"last_synced_commit":"41ba5bcde220d0cd7fb45df59f4b7d11cd2346db"},"previous_names":["the-katsu/rickandmortywiki"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Katsu%2FRickAndMortyWiki","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Katsu%2FRickAndMortyWiki/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Katsu%2FRickAndMortyWiki/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/The-Katsu%2FRickAndMortyWiki/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/The-Katsu","download_url":"https://codeload.github.com/The-Katsu/RickAndMortyWiki/tar.gz/refs/heads/release","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241180858,"owners_count":19923306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blazor","blazor-wasm","blazor-webassembly","csharp","docker","docker-compose","graphql","graphql-client","net7"],"created_at":"2024-09-27T21:21:43.175Z","updated_at":"2025-11-24T05:03:32.511Z","avatar_url":"https://github.com/The-Katsu.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\r\n\u003ch1 align=\"center\"\u003eRick And Morty Wiki Blazor App\u003c/h1\u003e\r\n\u003cp align=\"center\"\u003eYou can try it on GitHub Pages here \u003ca href=\"https://the-katsu.github.io/RickAndMortyWiki/\"\u003eRick And Morty Wiki\u003c/a\u003e\u003c/p\u003e  \r\n\u003cp align=\"center\"\u003eStack: .NET 7, Blazor WASM App, GraphQL.Client\u003c/p\u003e\r\n\r\n---  \r\n\r\n- Navigation\r\n    - [Pages](#pages)\r\n    - [Containerizing of Blazor WebAssembly App](#containerizing-of-blazor-webassembly-app)\r\n    - [Example of using GraphQL Client](#example-of-using-graphql-client)\r\n    - [Example of GraphQl request/response](#example-of-graphql-request-response)\r\n\r\n---\r\n\r\n## Pages\r\n\r\n\u003ch4 align=\"center\"\u003e~ Home ~\u003c/h4\u003e\r\n\r\n![](https://sun9-42.userapi.com/impg/AmA5XNF4OAQjx7qIO3z6nwMiRldQ_GhKvAnkMQ/PGZrkG8bRRo.jpg?size=1920x927\u0026quality=96\u0026sign=fcf6c1bc275645af543ca53d3fccd582\u0026type=album)  \r\n\r\n\u003ch4 align=\"center\"\u003e~ Characters ~\u003c/h4\u003e\r\n\r\n![](https://sun9-62.userapi.com/impg/ilC2BJl7VapUitnu2crBQjseosOX_0Ghl5iAQA/a2snLqrQ-Ws.jpg?size=1900x927\u0026quality=96\u0026sign=9002edf29f2ae5a4d4a940e9539c92f6\u0026type=album)\r\n\r\n\u003ch4 align=\"center\"\u003e~ Characters search ~\u003c/h4\u003e\r\n\r\n![](https://sun9-32.userapi.com/impg/KlfmImuiXP6n8rwauL98qEsDfMpiJTx3K8YijA/5eqfzs1brts.jpg?size=1904x931\u0026quality=96\u0026sign=3daa8e0b99c34837913af93e89b46b01\u0026type=album)\r\n\r\n\u003ch4 align=\"center\"\u003e~ Character ~\u003c/h4\u003e\r\n\r\n![](https://sun7-9.userapi.com/impg/gsjVEA-AS9qFrwwk3VAz1xPLLOarSobUiINhEg/xHQ1c8D3Z1g.jpg?size=1920x927\u0026quality=96\u0026sign=7557dc17dcbf607e3759d9dbb01d1e50\u0026type=album)\r\n\r\n\u003ch4 align=\"center\"\u003e~ Pagination ~\u003c/h4\u003e\r\n\r\n![](https://sun9-72.userapi.com/impg/UiqyjgJaTfpmUsiN697A7yz0KH_hHkOlbTgH8w/GVxGufarFiI.jpg?size=1898x930\u0026quality=96\u0026sign=a7f896b51d280ce4c0fd26126a21fb07\u0026type=album)\r\n\r\n\u003ch4 align=\"center\"\u003e~ Episodes ~\u003c/h4\u003e\r\n\r\n![](https://sun9-48.userapi.com/impg/KjztRiL9UKrJAoYDn8GyR1CvXRSmw_ZVTJjnCQ/x75XTa8oeTA.jpg?size=1902x923\u0026quality=96\u0026sign=e660657edd1a3a8a42f68f152bb28c34\u0026type=album)\r\n\r\n\u003ch4 align=\"center\"\u003e~ Locations ~\u003c/h4\u003e\r\n\r\n![](https://sun9-23.userapi.com/impg/AzI7YWgJHK8LPeVkZ9S1sOeWThZqBSsIsCV8uQ/ZbuTCJ2e8Ow.jpg?size=1901x919\u0026quality=96\u0026sign=ac810c4f0f928593d9cb6a135d940b3f\u0026type=album)  \r\n\r\n\u003ch4 align=\"center\"\u003e~ Adaptive :) ~\u003c/h4\u003e  \r\n\r\n![](https://sun9-72.userapi.com/impg/MeOljW2eK0X6yKURaD9UKcxgvL4k2C6_4ZFU-A/EUU4Xz2IjMg.jpg?size=2206x823\u0026quality=96\u0026sign=b5349a4c3fcbab5b2683d96f15bf7381\u0026type=album)\r\n\r\n\r\n## Containerizing of Blazor WebAssembly App\r\n\r\n*Delete github actions script from index.html \u0026 404.html if you have\r\n\r\n1. Create nginx.conf\r\n```javascript\r\nevents { }\r\nhttp {\r\n    include mime.types;\r\n\r\n    server {\r\n        listen 80;\r\n\r\n        location / {\r\n            root /usr/share/nginx/html;\r\n            try_files $uri $uri/ /index.html =404;\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n2. Create Dockerfile\r\n\r\n*Invoke from parent directory if you have additional libraries (like Application, Domain, etc)  \r\n\r\n```sql\r\nFROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base\r\nWORKDIR /app\r\nEXPOSE 80\r\nEXPOSE 443\r\n\r\nFROM mcr.microsoft.com/dotnet/sdk:7.0 AS build\r\nWORKDIR /src\r\nCOPY [\"src/Presentation/RickAndMortyWiki/RickAndMortyWiki.csproj\", \"src/Presentation/RickAndMortyWiki/\"]\r\nCOPY [\"src/Core/RickAndMortyWiki.Application/RickAndMortyWiki.Application.csproj\", \"src/Core/RickAndMortyWiki.Application/\"]\r\nCOPY [\"src/Core/RickAndMortyWiki.Domain/RickAndMortyWiki.Domain.csproj\", \"src/Core/RickAndMortyWiki.Domain/\"]\r\nRUN dotnet restore \"src/Presentation/RickAndMortyWiki/RickAndMortyWiki.csproj\"\r\nCOPY . .\r\nWORKDIR \"/src/src/Presentation/RickAndMortyWiki\"\r\nRUN dotnet build \"RickAndMortyWiki.csproj\" -c Release -o /app/build\r\n\r\nFROM build AS publish\r\nRUN dotnet publish \"RickAndMortyWiki.csproj\" -c Release -o /app/publish\r\n\r\nFROM nginx:alpine AS final\r\nWORKDIR /usr/share/nginx/html\r\nCOPY --from=publish /app/publish/wwwroot .\r\nCOPY nginx.conf /etc/nginx/nginx.conf\r\n```\r\n\r\n3. Create docker-compose.yaml\r\n```yaml\r\nversion: '3.4'\r\n\r\nservices:\r\n  blazorapp:\r\n    image: blazorandmorty\r\n    build:\r\n      context: .\r\n      dockerfile: Dockerfile\r\n    ports:\r\n      - 8080:80\r\n```\r\n\r\n4. Ron \"docker-compose up\" command\r\n\r\n\r\n5. Done  \r\n![](https://sun9-51.userapi.com/impg/8DHMUuhPctlKviuOt1DFy_tOPIyyxsoUUZ-gaQ/__70RVAiXPE.jpg?size=1637x102\u0026quality=96\u0026sign=021163aa4f0b2c5c1707a22dbbe22b50\u0026type=album)\r\n\r\n## Example of using GraphQL Client\r\n\r\n\u003cp\u003eThe strength of GraphQl is that we ourselves determine the values we need\u003c/p\u003e\r\n\r\n```cs\r\n// Base model for GraphQl response (data : { response: { info: { } results: { } } })\r\npublic class Response\u003cT\u003e where T : class\r\n{\r\n    public Information Info { get; set; } = null!;\r\n    public List\u003cT\u003e Results { get; set; } = new();\r\n}\r\n\r\n// Base model for response handling\r\npublic class GraphQlArrayResponse\u003cT\u003e where T : class\r\n{\r\n    public Response\u003cT\u003e Response { get; set; }\r\n}\r\n\r\n// Make the query\r\npublic static GraphQLRequest GetPage(int pageNum) =\u003e\r\n    new()\r\n    {\r\n        Query = @$\"{{\r\n            response: characters(page: {pageNum}) {{\r\n                info {{\r\n                    count\r\n                    pages\r\n                    next\r\n                    prev\r\n                }}\r\n                results {{\r\n                    id\r\n                    name\r\n                    image\r\n                }}\r\n            }}\r\n        }}\"\r\n    };\r\n\r\n// Handle the data\r\npublic async Task\u003cResponse\u003cCharacter\u003e\u003e GetPage(int pageNum)\r\n{\r\n    var graphQlClient = new GraphQLHttpClient(Urls.RickAndMortyGraphQl, new NewtonsoftJsonSerializer());\r\n    var response = \r\n        await graphQlClient.SendQueryAsync\u003cGraphQlArrayResponse\u003cCharacter\u003e\u003e(CharacterQueries.GetPage(pageNum));\r\n    return response.Data.Response;\r\n}\r\n\r\n```\r\n\r\n## Example of GraphQl request response\r\n\r\n\u003ch4\u003eRequest\u003c/h4\u003e\r\n\r\n```javascript\r\n{\r\n  response: characters(page: 1) {\r\n    info {\r\n      count\r\n      pages\r\n      next\r\n      prev\r\n    }\r\n    results {\r\n      id\r\n      name\r\n      image\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n\u003ch4\u003eResponse\u003c/h4\u003e\r\n\r\n```json\r\n{\r\n  \"data\": {\r\n    \"response\": {\r\n      \"info\": {\r\n        \"count\": 826,\r\n        \"pages\": 42,\r\n        \"next\": 2,\r\n        \"prev\": null\r\n      },\r\n      \"results\": [\r\n        {\r\n          \"id\": \"1\",\r\n          \"name\": \"Rick Sanchez\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/1.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"2\",\r\n          \"name\": \"Morty Smith\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/2.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"3\",\r\n          \"name\": \"Summer Smith\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/3.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"4\",\r\n          \"name\": \"Beth Smith\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/4.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"5\",\r\n          \"name\": \"Jerry Smith\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/5.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"6\",\r\n          \"name\": \"Abadango Cluster Princess\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/6.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"7\",\r\n          \"name\": \"Abradolf Lincler\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/7.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"8\",\r\n          \"name\": \"Adjudicator Rick\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/8.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"9\",\r\n          \"name\": \"Agency Director\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/9.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"10\",\r\n          \"name\": \"Alan Rails\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/10.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"11\",\r\n          \"name\": \"Albert Einstein\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/11.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"12\",\r\n          \"name\": \"Alexander\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/12.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"13\",\r\n          \"name\": \"Alien Googah\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/13.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"14\",\r\n          \"name\": \"Alien Morty\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/14.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"15\",\r\n          \"name\": \"Alien Rick\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/15.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"16\",\r\n          \"name\": \"Amish Cyborg\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/16.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"17\",\r\n          \"name\": \"Annie\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/17.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"18\",\r\n          \"name\": \"Antenna Morty\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/18.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"19\",\r\n          \"name\": \"Antenna Rick\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/19.jpeg\"\r\n        },\r\n        {\r\n          \"id\": \"20\",\r\n          \"name\": \"Ants in my Eyes Johnson\",\r\n          \"image\": \"https://rickandmortyapi.com/api/character/avatar/20.jpeg\"\r\n        }\r\n      ]\r\n    }\r\n  }\r\n}\r\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-katsu%2Frickandmortywiki","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthe-katsu%2Frickandmortywiki","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-katsu%2Frickandmortywiki/lists"}