# CiteLynq Web Sample A sample ASP.NET Core web application demonstrating how to use the CiteLynq API to search for verified citations across multiple authoritative sources. ## Features ✅ ASP.NET Core 9.0 minimal API ✅ Static file hosting with wwwroot ✅ Proxy endpoints to hide API keys from client ✅ Clean, modern UI with gradient design ✅ Search across multiple data sources ✅ Display formatted citations (APA, MLA, Bluebook) ✅ Filter by source type (ArXiv, PubMed, CourtListener, etc.) ✅ Responsive design ✅ Local storage for API key persistence ## Quick Start ### 1. Get an API Key 1. Visit [https://citelynq.com/app/api-keys](https://citelynq.com/app/api-keys) 2. Create a new API key 3. Copy the key (starts with `cl_`) ### 2. Run the Application ```bash cd /repos/CiteFlow/samples/CiteLynq.WebSample dotnet run ``` The application will start on `http://localhost:5100` ### 3. Use the Application 1. Open your browser to `http://localhost:5100` 2. Enter your API key 3. Enter a search query (e.g., "climate change") 4. Click "Search" ## Project Structure ``` CiteLynq.WebSample/ ├── Program.cs # ASP.NET Core minimal API ├── CiteLynq.WebSample.csproj # Project file ├── Properties/ │ └── launchSettings.json # Launch configuration └── wwwroot/ └── index.html # Single-page application ``` ## How It Works ### Backend (Program.cs) The backend provides proxy endpoints to securely call the CiteLynq API: 1. **GET /api/search** - Proxies search requests - Accepts: query parameters (q, sourceType, page, pageSize) - Headers: X-API-Key - Returns: Search results from CiteLynq API 2. **GET /api/articles/{id}** - Proxies article detail requests - Accepts: article ID as path parameter - Headers: X-API-Key - Returns: Article details from CiteLynq API **Why use a proxy?** - Hides your API key from client-side code - Prevents CORS issues - Adds an abstraction layer for future enhancements - Enables server-side caching if needed ### Frontend (wwwroot/index.html) The frontend is a self-contained single-page application: - **API Key Storage**: Saves API key in localStorage - **Search Interface**: Query input and source filter - **Results Display**: Shows citations with metadata - **Responsive Design**: Works on desktop and mobile ## API Endpoints ### Search Citations ```http GET /api/search?q=climate%20change&sourceType=ArXiv&page=1&pageSize=20 X-API-Key: cl_your-api-key-here ``` **Response:** ```json { "data": { "results": [ { "id": "arxiv-2301.12345", "sourceType": "ArXiv", "title": "Climate Change Research", "authors": ["Dr. Jane Smith"], "abstract": "...", "publishedDate": "2023-01-15", "url": "https://arxiv.org/abs/2301.12345", "citations": { "apa": "Smith, J. (2023)...", "mla": "Smith, Jane...", "chicago": "..." } } ], "totalCount": 145 } } ``` ### Get Article Details ```http GET /api/articles/arxiv-2301.12345 X-API-Key: cl_your-api-key-here ``` ## Configuration ### Change API Base URL Edit `Program.cs` line 24 to point to a different API: ```csharp const string API_BASE_URL = "https://citelynq.com/api"; // Or for local development: // const string API_BASE_URL = "http://localhost:5000/api"; ``` ### Change Port Edit `Properties/launchSettings.json`: ```json { "profiles": { "http": { "applicationUrl": "http://localhost:5100" } } } ``` ## Development ### Prerequisites - .NET 9.0 SDK - Visual Studio 2022 / VS Code / Rider ### Build ```bash dotnet build ``` ### Run ```bash dotnet run ``` ### Publish ```bash dotnet publish -c Release -o ./publish ``` ## Customization ### Add More Endpoints Add new proxy endpoints in `Program.cs`: ```csharp app.MapGet("/api/sources", async (HttpContext context, IHttpClientFactory httpClientFactory) => { var apiKey = context.Request.Headers["X-API-Key"].FirstOrDefault(); var httpClient = httpClientFactory.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Get, $"{API_BASE_URL}/sources"); httpRequest.Headers.Add("X-API-Key", apiKey); var response = await httpClient.SendAsync(httpRequest); return Results.Content(await response.Content.ReadAsStringAsync(), "application/json"); }); ``` ### Customize UI Edit `wwwroot/index.html`: ```css /* Change color scheme */ body { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } ``` ### Add Pagination Add pagination controls in the HTML: ```javascript function displayResults(data) { // ... existing code ... if (data.totalPages > 1) { html += `