Dalibor Votruba 6e23edd824 qdr-temporary-shared-storage: permalink changes fixes. Working after test 1 rok pred
..
qdr.app.tss.client 7491245791 qdr-temporary-shared-storage: CLI FileUploadService.UploadFileAsync returns FileId and ResultCode 1 rok pred
qdr.app.tss.client.console 6e23edd824 qdr-temporary-shared-storage: permalink changes fixes. Working after test 1 rok pred
directory-structure.txt 07b939be0e qdr-temporary-shared-storage: add readme.md 1 rok pred
qdr.app.tss.client.sln ef4fed917e qdr-temporary-shared-storage: add initial .net 9 client library, fix pack.cmd 1 rok pred
readme.md 07b939be0e qdr-temporary-shared-storage: add readme.md 1 rok pred
rest-api-docs.md 45c3630c67 qdr-temporary-shared-storage: finalize cli console 1 rok pred
test.pdf 1b7b03755f qdr-temporary-shared-storage: fix bugs and test 1 rok pred

readme.md

QDR Temporary Shared Storage - .NET Client

A comprehensive .NET client library and console application for uploading and managing files through the QDR Temporary Shared Storage WordPress plugin REST API.

Overview

This project provides:

  • REST Client Library (qdr.app.tss.client) - Low-level HTTP client for API communication
  • File Upload Service - High-level service with chunked upload support and progress reporting
  • Console Application (qdr.app.tss.client.console) - Command-line tool for file uploads
  • Complete DTO Models - Strongly-typed request/response objects

Features

  • Chunked File Uploads - Efficient handling of large files with configurable chunk sizes
  • Progress Reporting - Real-time upload progress feedback
  • Authentication - API key-based authentication
  • Error Handling - Comprehensive error handling and user-friendly messages
  • File Management - Full CRUD operations for shared files
  • Password Protection - Secure file sharing with password requirements
  • Expiration Dates - Configurable file availability periods
  • Reference Codes - Custom reference values for file identification

Requirements

  • .NET 9.0 or later
  • QDR Temporary Shared Storage WordPress plugin installed and configured
  • Valid API key from the WordPress plugin

Installation

NuGet Package

# Install the client library
dotnet add package qdr.app.tss.client

Build from Source

git clone <repository-url>
cd qdr.app.tss.client
dotnet build

Quick Start

Using the Console Application

# Upload a file with all options
qdr.app.tss.client.console.exe upload \
  -url:"https://your-wordpress-site.com/" \
  -apiKey:"your-api-key-here" \
  -file:"path/to/your/file.pdf" \
  -pwd:"download-password" \
  -descr:"File description" \
  -msg:"Message for downloaders" \
  -ref:"REF001" \
  -activeFrom:"2025-05-22 10:00:00" \
  -activeTo:"2025-06-22 10:00:00" \
  -chunkSize:1048576

Using the .NET Library

using Quadarax.Application.TemporarySharedStorage.Client;
using Quadarax.Application.TemporarySharedStorage.Client.Services;
using Quadarax.Application.TemporarySharedStorage.Client.Dtos.Request;

// Initialize the upload service
var logger = new ConsoleLogger(LogSeverityEnum.Info, LogSeverityEnum.Debug, LogSeverityEnum.Error);
var uploadService = new FileUploadService("https://your-site.com", "your-api-key", logger);

// Create upload request
var request = new UploadFileRequest
{
    FilePath = @"C:\path\to\file.pdf",
    Description = "Important document",
    Password = "secure123",
    Message = "Please review this document",
    Reference = "DOC001",
    ActiveFrom = DateTime.Now,
    ActiveTo = DateTime.Now.AddDays(30),
    ChunkSize = 1048576 // 1MB chunks
};

// Upload the file
await uploadService.UploadFileAsync(request);

Console Application Usage

Command Line Arguments

Argument Required Description Example
-url WordPress site URL https://example.com/
-apiKey API key from plugin settings riyeVPRvz9QF1YmrhdSz9rgiVzhy3mSb
-file Path to file to upload C:\documents\file.pdf
-pwd Download password securePassword123
-activeFrom Start date/time "2025-05-22 10:00:00"
-activeTo End date/time "2025-06-22 10:00:00"
-msg Message for downloaders "Please review"
-ref Reference code REF001
-descr File description "Important document"
-chunkSize Chunk size in bytes 1048576 (default: 1MB)

Example Commands

# Minimal upload
upload -url:"https://site.com/" -apiKey:"key123" -file:"doc.pdf" -pwd:"pass" -activeFrom:"2025-05-22" -activeTo:"2025-06-22" -msg:"Review please" -ref:"DOC01"

# Upload with custom chunk size (5MB)
upload -url:"https://site.com/" -apiKey:"key123" -file:"large-file.zip" -pwd:"pass" -activeFrom:"2025-05-22" -activeTo:"2025-06-22" -msg:"Download when ready" -ref:"ZIP01" -chunkSize:5242880

.NET Library Usage

Direct REST Client Usage

using var restClient = new QdrTssRestClient("https://your-site.com", "your-api-key");

// Initialize upload
var initRequest = new InitUploadRequest
{
    OriginalFileName = "document.pdf",
    FileSize = fileInfo.Length
};
var initResponse = await restClient.InitializeUploadAsync(initRequest);

// Upload chunks (example for single chunk)
byte[] chunkData = File.ReadAllBytes("document.pdf");
var chunkResponse = await restClient.UploadChunkAsync(
    initResponse.UploadId, 
    0, // chunk index
    1, // total chunks
    chunkData
);

// Finalize upload
var finalizeRequest = new FinalizeUploadRequest
{
    UploadId = initResponse.UploadId,
    TotalChunks = 1,
    OriginalFileName = "document.pdf",
    Description = "Important document",
    Password = "secure123",
    ActiveFrom = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
    ActiveTo = DateTime.Now.AddDays(30).ToString("yyyy-MM-dd HH:mm:ss")
};
var finalResult = await restClient.FinalizeUploadAsync(finalizeRequest);

Console.WriteLine($"File uploaded! ID: {finalResult.FileId}");
Console.WriteLine($"Download URL: {finalResult.Permalink}");

File Management Operations

using var restClient = new QdrTssRestClient("https://your-site.com", "your-api-key");

// Get file details
var fileDetails = await restClient.GetMediaAsync("file-id-123");

// Update file properties
var updateRequest = new UpdateMediaRequest
{
    Message = "Updated message",
    Description = "Updated description",
    ActiveTo = DateTime.Now.AddDays(60).ToString("yyyy-MM-dd HH:mm:ss")
};
await restClient.UpdateMediaAsync("file-id-123", updateRequest);

// List files with filtering
var files = await restClient.GetMediaListAsync(
    page: 1,
    perPage: 20,
    orderBy: "upload_date",
    order: "DESC",
    originalFileName: "*.pdf"
);

// Delete file
await restClient.DeleteMediaAsync("file-id-123");

Configuration

API Key Setup

  1. Install the QDR Temporary Shared Storage plugin in WordPress
  2. Navigate to Settings > Shared Storage
  3. Generate or copy your API key
  4. Use the key in your application

Upload Limits

  • Maximum file size depends on your WordPress/server configuration
  • Chunked uploads help bypass PHP upload limits
  • Recommended chunk size: 1-5MB for optimal performance

Error Handling

The library provides comprehensive error handling:

try
{
    await uploadService.UploadFileAsync(request);
}
catch (FileNotFoundException ex)
{
    Console.WriteLine($"File not found: {ex.Message}");
}
catch (ArgumentException ex)
{
    Console.WriteLine($"Invalid argument: {ex.Message}");
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"Network error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Unexpected error: {ex.Message}");
}

Build Scripts

The project includes convenient build scripts:

  • buildD.cmd - Debug build
  • buildR.cmd - Release build
  • publishD.cmd - Debug build and publish to local NuGet
  • publishR.cmd - Release build and publish to local NuGet
  • bootstrap.cmd - Environment setup

Project Structure

qdr.app.tss.client/
├── qdr.app.tss.client/                 # Core library
│   ├── Dtos/                          # Data transfer objects
│   │   ├── Request/                   # Request models
│   │   └── Response/                  # Response models
│   ├── Services/                      # High-level services
│   └── TssRestClient.cs              # Low-level REST client
├── qdr.app.tss.client.console/        # Console application
│   ├── Commands/                      # Command implementations
│   └── Program.cs                     # Entry point
└── Documentation/
    └── rest-api-docs.md              # Complete API documentation

Dependencies

  • qdr.fnd.core (0.0.8-alpha) - Foundation library
  • qdr.fnd.core.qconsole (0.0.7-alpha) - Console framework
  • System.IO.Abstractions - File system abstraction
  • .NET 9.0 - Target framework

API Endpoints

The client supports all REST API endpoints:

Endpoint Method Description
/upload/init POST Initialize chunked upload
/upload/chunk POST Upload file chunk
/upload/finalize POST Complete upload
/media/{id} GET Get file details
/media/{id} PUT Update file properties
/media/{id} DELETE Delete file
/media GET List files with filtering

WordPress Plugin Integration

This client is designed to work with the QDR Temporary Shared Storage WordPress plugin. The plugin provides:

  • Secure file storage and management
  • Password-protected downloads
  • Expiration date handling
  • Download analytics
  • WordPress shortcode integration
  • Admin interface for file management

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

License

Copyright © Quadarax 2025. All rights reserved.

Support

For support and documentation:

Changelog

Version 1.0.0

  • Initial release
  • Chunked file upload support
  • Complete REST API client
  • Console application
  • Comprehensive error handling
  • Progress reporting