feat: initial Commit

master
yosheng 2025-07-26 01:13:30 +08:00
commit 398b3756e9
15 changed files with 731 additions and 0 deletions

341
.gitignore vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,108 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using ProjectApi;
using ProjectApi.Models;

namespace ProjectApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class WorkItemController : ControllerBase
{
private readonly WorkItemContext _context;

public WorkItemController(WorkItemContext context)
{
_context = context;
}

// GET: api/WorkItem
[HttpGet]
public async Task<ActionResult<IEnumerable<WorkItem>>> GetWorkItems()
{
return await _context.WorkItems.ToListAsync();
}

// GET: api/WorkItem/5
[HttpGet("{id}")]
public async Task<ActionResult<WorkItem>> GetWorkItem(int id)
{
var workItem = await _context.WorkItems.FindAsync(id);

if (workItem == null)
{
return NotFound();
}

return workItem;
}

// PUT: api/WorkItem/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutWorkItem(int id, WorkItem workItem)
{
if (id != workItem.Id)
{
return BadRequest();
}

_context.Entry(workItem).State = EntityState.Modified;

try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!WorkItemExists(id))
{
return NotFound();
}
else
{
throw;
}
}

return NoContent();
}

// POST: api/WorkItem
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<WorkItem>> PostWorkItem(WorkItem workItem)
{
_context.WorkItems.Add(workItem);
await _context.SaveChangesAsync();

return CreatedAtAction("GetWorkItem", new { id = workItem.Id }, workItem);
}

// DELETE: api/WorkItem/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteWorkItem(int id)
{
var workItem = await _context.WorkItems.FindAsync(id);
if (workItem == null)
{
return NotFound();
}

_context.WorkItems.Remove(workItem);
await _context.SaveChangesAsync();

return NoContent();
}

private bool WorkItemExists(int id)
{
return _context.WorkItems.Any(e => e.Id == id);
}
}
}

View File

@ -0,0 +1,46 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using ProjectApi;

#nullable disable

namespace ProjectApi.Migrations
{
[DbContext(typeof(WorkItemContext))]
[Migration("20250724160300_Initial")]
partial class Initial
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "9.0.0");

modelBuilder.Entity("ProjectApi.Models.WorkItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");

b.Property<string>("Description")
.IsRequired()
.HasColumnType("TEXT");

b.Property<int>("Status")
.HasColumnType("INTEGER");

b.Property<string>("Title")
.IsRequired()
.HasColumnType("TEXT");

b.HasKey("Id");

b.ToTable("WorkItems");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace ProjectApi.Migrations
{
/// <inheritdoc />
public partial class Initial : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "WorkItems",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Title = table.Column<string>(type: "TEXT", nullable: false),
Description = table.Column<string>(type: "TEXT", nullable: false),
Status = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WorkItems", x => x.Id);
});
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "WorkItems");
}
}
}

View File

@ -0,0 +1,43 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using ProjectApi;

#nullable disable

namespace ProjectApi.Migrations
{
[DbContext(typeof(WorkItemContext))]
partial class WorkItemContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "9.0.0");

modelBuilder.Entity("ProjectApi.Models.WorkItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");

b.Property<string>("Description")
.IsRequired()
.HasColumnType("TEXT");

b.Property<int>("Status")
.HasColumnType("INTEGER");

b.Property<string>("Title")
.IsRequired()
.HasColumnType("TEXT");

b.HasKey("Id");

b.ToTable("WorkItems");
});
#pragma warning restore 612, 618
}
}
}

19
Models/WorkItem.cs Normal file
View File

@ -0,0 +1,19 @@
namespace ProjectApi.Models;

public enum WorkItemStatus
{
Pending = 0,
Confirm = 1
}

public class WorkItem
{
public int Id { get; set; }

public string Title { get; set; }

public string Description { get; set; }

public WorkItemStatus Status { get; set; }
}

47
Program.cs Normal file
View File

@ -0,0 +1,47 @@
using Microsoft.EntityFrameworkCore;
using ProjectApi;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddDbContext<WorkItemContext>(opt =>
{
opt.UseSqlite($"Data Source=project.db");
});

builder.Services.AddControllers();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();

// Add CORS
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowFrontend", policy =>
{
policy.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}

app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/openapi/v1.json", "OpenAPI V1");
});

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

25
ProjectApi.csproj Normal file
View File

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.3" />
</ItemGroup>

</Project>

6
ProjectApi.http Normal file
View File

@ -0,0 +1,6 @@
@ProjectApi_HostAddress = http://localhost:5104

GET {{ProjectApi_HostAddress}}/weatherforecast/
Accept: application/json

###

View File

@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5104",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7174;http://localhost:5104",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

13
WorkItemContext.cs Normal file
View File

@ -0,0 +1,13 @@
using Microsoft.EntityFrameworkCore;
using ProjectApi.Models;

namespace ProjectApi;

public class WorkItemContext : DbContext
{
public DbSet<WorkItem>? WorkItems { get; set; }

public WorkItemContext(DbContextOptions options) : base(options)
{
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

9
appsettings.json Normal file
View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

7
global.json Normal file
View File

@ -0,0 +1,7 @@
{
"sdk": {
"version": "9.0.0",
"rollForward": "latestMajor",
"allowPrerelease": true
}
}

BIN
project.db Normal file

Binary file not shown.