| using ProtoBuf; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Text.Json.Serialization; | |||||
| using System.Threading.Tasks; | |||||
| namespace Grpc.Shared.DTOs.Search | |||||
| { | |||||
| [ProtoContract] | |||||
| internal class SearchDTO | |||||
| { | |||||
| public partial class SearchContracts | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public Tracks? Tracks { get; set; } | |||||
| } | |||||
| public partial class Tracks | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public Uri Href { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public Items[]? Items { get; set; } | |||||
| } | |||||
| public partial class Items | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public Album Album { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public Artist[] Artists { get; set; } | |||||
| [ProtoMember(3)] | |||||
| public long DurationMs { get; set; } | |||||
| [ProtoMember(4)] | |||||
| public ExternalUrls ExternalUrls { get; set; } | |||||
| [ProtoMember(5)] | |||||
| public Uri Href { get; set; } | |||||
| [ProtoMember(6)] | |||||
| public string Id { get; set; } | |||||
| [ProtoMember(7)] | |||||
| public string Name { get; set; } | |||||
| [ProtoMember(8)] | |||||
| public long Popularity { get; set; } | |||||
| [ProtoMember(9)] | |||||
| public long TrackNumber { get; set; } | |||||
| [ProtoMember(10)] | |||||
| public string Type { get; set; } | |||||
| [ProtoMember(11)] | |||||
| public string Uri { get; set; } | |||||
| } | |||||
| public partial class Album | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public Uri Href { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public string Id { get; set; } | |||||
| [ProtoMember(3)] | |||||
| public Image[] Images { get; set; } | |||||
| [ProtoMember(4)] | |||||
| public string Name { get; set; } | |||||
| [ProtoMember(5)] | |||||
| public DateTimeOffset ReleaseDate { get; set; } | |||||
| [ProtoMember(6)] | |||||
| public long TotalTracks { get; set; } | |||||
| [ProtoMember(7)] | |||||
| public string Type { get; set; } | |||||
| [ProtoMember(8)] | |||||
| public string Uri { get; set; } | |||||
| } | |||||
| public partial class Image | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public long Height { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public Uri Url { get; set; } | |||||
| [ProtoMember(3)] | |||||
| public long Width { get; set; } | |||||
| } | |||||
| public partial class Artist | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public ExternalUrls ExternalUrls { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public Uri Href { get; set; } | |||||
| [ProtoMember(3)] | |||||
| public string Id { get; set; } | |||||
| [ProtoMember(4)] | |||||
| public string Name { get; set; } | |||||
| [ProtoMember(5)] | |||||
| public string Type { get; set; } | |||||
| [ProtoMember(6)] | |||||
| public string Uri { get; set; } | |||||
| } | |||||
| public partial class ExternalUrls | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public Uri Spotify { get; set; } | |||||
| } | |||||
| } | |||||
| } |
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Grpc.Shared.DTOs.Search | |||||
| { | |||||
| internal class SearchRequestDTO | |||||
| { | |||||
| } | |||||
| } |
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <PropertyGroup> | |||||
| <TargetFramework>net6.0</TargetFramework> | |||||
| <ImplicitUsings>enable</ImplicitUsings> | |||||
| <Nullable>enable</Nullable> | |||||
| </PropertyGroup> | |||||
| <ItemGroup> | |||||
| <PackageReference Include="protobuf-net.Core" Version="3.1.17" /> | |||||
| <PackageReference Include="System.ServiceModel.Primitives" Version="4.5.3" /> | |||||
| </ItemGroup> | |||||
| </Project> |
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Runtime.Serialization; | |||||
| using System.ServiceModel; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace GrpcShared.Interfaces | |||||
| { | |||||
| [ServiceContract] | |||||
| public interface ISearchService | |||||
| { | |||||
| Task<SearchResult> SearchTracks(SearchRequest req); | |||||
| } | |||||
| [DataContract] | |||||
| public class SearchResult | |||||
| { | |||||
| [DataMember(Order = 1)] | |||||
| public string NewQuery { get; set; } | |||||
| [DataMember(Order = 2)] | |||||
| public string NewType { get; set; } | |||||
| } | |||||
| [DataContract] | |||||
| public class SearchRequest | |||||
| { | |||||
| [DataMember(Order = 1)] | |||||
| public string Query { get; set; } | |||||
| [DataMember(Order = 2)] | |||||
| public string Type { get; set; } = "track"; | |||||
| } | |||||
| } |
| using ProtoBuf; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace GrpcShared.DTO.Auth | |||||
| { | |||||
| [ProtoContract] | |||||
| public class AuthRequest | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public string ClientId { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public string ClientSecret { get; set; } | |||||
| [ProtoMember(3)] | |||||
| public string RedirectURI { get; set; } | |||||
| [ProtoMember(4)] | |||||
| public string ResponseType { get; set; } = "track"; | |||||
| [ProtoMember(5)] | |||||
| public string Scope { get; set; } | |||||
| [ProtoMember(6)] | |||||
| public string ShowDialog{ get; set; } | |||||
| } | |||||
| } |
| using ProtoBuf; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace GrpcShared.DTO.Auth | |||||
| { | |||||
| [ProtoContract] | |||||
| public class AuthResponse | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public string AccessToken { get; set; } | |||||
| [ProtoMember(2)] | |||||
| public string RefreshToken{ get; set; } | |||||
| } | |||||
| } |
| using ProtoBuf; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace GrpcShared.DTO.Auth | |||||
| { | |||||
| [ProtoContract] | |||||
| public class CodeResponse | |||||
| { | |||||
| [ProtoMember(1)] | |||||
| public string Code { get; set; } | |||||
| } | |||||
| } |
| using GrpcShared.DTO.Auth; | |||||
| namespace IdentityProvider.Services.Interfaces | |||||
| { | |||||
| public interface IAuthService | |||||
| { | |||||
| Task<CodeResponse> GetCode(AuthRequest request); | |||||
| Task<AuthResponse> GetAccessToken(CodeResponse code); | |||||
| } | |||||
| } |
| <Project Sdk="Microsoft.NET.Sdk.Web"> | |||||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | |||||
| <PropertyGroup> | <PropertyGroup> | ||||
| <TargetFramework>net6.0</TargetFramework> | <TargetFramework>net6.0</TargetFramework> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> | |||||
| <Protobuf Include="Protos\auth.proto" GrpcServices="Server" /> | |||||
| <PackageReference Include="Grpc.AspNetCore" Version="2.40.0" /> | |||||
| <PackageReference Include="Grpc.AspNetCore.Web" Version="2.47.0" /> | |||||
| <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="6.0.8" /> | |||||
| <PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" /> | |||||
| <PackageReference Include="protobuf-net.Grpc.AspNetCore.Reflection" Version="1.0.152" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="Grpc.AspNetCore" Version="2.40.0" /> | |||||
| <ProjectReference Include="..\GrpcShared\GrpcShared.csproj" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| </Project> | </Project> |
| using IdentityProvider.Services; | using IdentityProvider.Services; | ||||
| using ProtoBuf.Grpc.Server; | |||||
| var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||||
| // Additional configuration is required to successfully run gRPC on macOS. | // Additional configuration is required to successfully run gRPC on macOS. | ||||
| // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 | // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 | ||||
| // Add services to the container. | |||||
| builder.Services.AddControllersWithViews(); | |||||
| builder.Services.AddRazorPages(); | |||||
| builder.Services.AddEndpointsApiExplorer(); | |||||
| builder.Services.AddGrpc(); | builder.Services.AddGrpc(); | ||||
| builder.Services.AddCodeFirstGrpc(); | |||||
| builder.Services.AddCodeFirstGrpcReflection(); | |||||
| var app = builder.Build(); | var app = builder.Build(); | ||||
| // Configure the HTTP request pipeline. | // Configure the HTTP request pipeline. | ||||
| app.MapGrpcService<GreeterService>(); | |||||
| app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); | |||||
| if (app.Environment.IsDevelopment()) | |||||
| { | |||||
| app.UseWebAssemblyDebugging(); | |||||
| } | |||||
| else | |||||
| { | |||||
| app.UseExceptionHandler("/Error"); | |||||
| // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. | |||||
| app.UseHsts(); | |||||
| } | |||||
| app.UseHttpsRedirection(); | |||||
| app.UseBlazorFrameworkFiles(); | |||||
| app.UseStaticFiles(); | |||||
| app.UseRouting(); | |||||
| app.UseGrpcWeb(); | |||||
| app.MapRazorPages(); | |||||
| app.MapControllers(); | |||||
| //app.MapGrpcService<WeatherService>(); | |||||
| app.MapGrpcService<AuthService>().EnableGrpcWeb(); | |||||
| app.MapCodeFirstGrpcReflectionService(); | |||||
| app.MapFallbackToFile("index.html"); | |||||
| app.Run(); | |||||
| app.Run(); |
| syntax = "proto3"; | |||||
| option csharp_namespace = "IdentityProvider.Protos"; | |||||
| package auth; | |||||
| service AuthorizationService { | |||||
| rpc RedirectUser(AuthParams) returns (AuthResponse); | |||||
| rpc GetAccessToken(AuthResponse) returns (AccessResponse); | |||||
| } | |||||
| message AuthParams{ | |||||
| string client_id = 1; | |||||
| string redirect_uri = 2; | |||||
| string response_type = 3; | |||||
| string scope = 4; | |||||
| bool show_dialog = 5; | |||||
| } | |||||
| message AuthResponse { | |||||
| string code = 1; | |||||
| } | |||||
| message AccessResponse { | |||||
| string access_token = 1; | |||||
| } |
| syntax = "proto3"; | |||||
| option csharp_namespace = "IdentityProvider"; | |||||
| package greet; | |||||
| // The greeting service definition. | |||||
| service Greeter { | |||||
| // Sends a greeting | |||||
| rpc SayHello (HelloRequest) returns (HelloReply); | |||||
| } | |||||
| // The request message containing the user's name. | |||||
| message HelloRequest { | |||||
| string name = 1; | |||||
| } | |||||
| // The response message containing the greetings. | |||||
| message HelloReply { | |||||
| string message = 1; | |||||
| } |
| //using IdentityProvider.Protos.AuthService; | //using IdentityProvider.Protos.AuthService; | ||||
| using GrpcShared.DTO.Auth; | |||||
| using IdentityProvider.Services.Interfaces; | |||||
| namespace IdentityProvider.Services | namespace IdentityProvider.Services | ||||
| { | { | ||||
| public class AuthService | |||||
| public class AuthService :IAuthService | |||||
| { | { | ||||
| private readonly ILogger<AuthService> _logger; | private readonly ILogger<AuthService> _logger; | ||||
| public AuthService(ILogger<AuthService> logger) | public AuthService(ILogger<AuthService> logger) | ||||
| _logger = logger; | _logger = logger; | ||||
| } | } | ||||
| public Task<AuthResponse> GetAccessToken(CodeResponse code) | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public Task<CodeResponse> GetCode(AuthRequest request) | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| } | } | ||||
| } | } |
| using Grpc.Core; | |||||
| using IdentityProvider; | |||||
| namespace IdentityProvider.Services | |||||
| { | |||||
| public class GreeterService : Greeter.GreeterBase | |||||
| { | |||||
| private readonly ILogger<GreeterService> _logger; | |||||
| public GreeterService(ILogger<GreeterService> logger) | |||||
| { | |||||
| _logger = logger; | |||||
| } | |||||
| public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) | |||||
| { | |||||
| return Task.FromResult(new HelloReply | |||||
| { | |||||
| Message = "Hello " + request.Name | |||||
| }); | |||||
| } | |||||
| } | |||||
| } |
| @code { | @code { | ||||
| private async Task OnInitializedAsync() | |||||
| { | |||||
| NavigationManager.NavigateTo(); | |||||
| } | |||||
| } | } |