mycroforge/MycroForge.CLI/CodeGen/EntityLinker.cs

123 lines
4.7 KiB
C#

using Humanizer;
namespace MycroForge.CLI.CodeGen;
public partial class EntityLinker
{
private readonly ProjectContext _context;
private readonly string _left;
private readonly string _right;
public EntityLinker(ProjectContext context, string left, string right)
{
_context = context;
_left = left;
_right = right;
}
public async Task OneToOne()
{
var left = await LoadEntity(_left);
var right = await LoadEntity(_right);
left.AppendColumn(
$"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName}\")"
);
right.AppendColumns([
$"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))",
$"\t{left.FieldName}: Mapped[\"{left.ClassName}\"] = relationship(back_populates=\"{right.FieldName}\")"
]);
await _context.WriteFile(left.Path, left.Rewrite());
await _context.WriteFile(right.Path, right.Rewrite());
}
public async Task OneToMany()
{
var left = await LoadEntity(_left);
var right = await LoadEntity(_right);
left.Import(from: "typing", import: "List");
left.AppendColumn($"\t{right.FieldName.Pluralize()}: Mapped[List[\"{right.ClassName}\"]] = relationship()");
right.AppendColumns([
$"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))",
$"\t{left.FieldName}: Mapped[\"{left.ClassName}\"] = relationship(back_populates=\"{right.FieldName}\")"
]);
await _context.WriteFile(left.Path, left.Rewrite());
await _context.WriteFile(right.Path, right.Rewrite());
}
public async Task ManyToOne()
{
var left = await LoadEntity(_left);
var right = await LoadEntity(_right);
left.Import(from: "typing", import: "Optional");
left.AppendColumns([
$"\t{right.FieldName}_id: Mapped[Optional[int]] = mapped_column(ForeignKey(\"{right.TableName}.id\"))",
$"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName.Pluralize()}\")"
]);
left.Import(from: "typing", import: "List");
right.AppendColumns([
$"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))",
$"\t{left.FieldName.Pluralize()}: Mapped[List[\"{left.ClassName}\"]] = relationship(back_populates=\"{right.FieldName}\")"
]);
await _context.WriteFile(left.Path, left.Rewrite());
await _context.WriteFile(right.Path, right.Rewrite());
}
public async Task ManyToMany()
{
// var left = await LoadEntity(_left);
// var right = await LoadEntity(_right);
//
// left.AppendImportIfNotExists(
// $"orm.entities.{right.FieldName}",
// $"{right.ClassName}",
// $"from orm.entities.{right.FieldName} import {right.ClassName}"
// );
// left.AppendImportIfNotExists(
// "typing",
// "Optional",
// "from typing import Optional"
// );
// left.AppendColumn([
// $"\t{right.FieldName}_id: Mapped[Optional[int]] = mapped_column(ForeignKey(\"{right.TableName}.id\"))",
// $"\t{right.FieldName}: Mapped[\"{right.ClassName}\"] = relationship(back_populates=\"{left.FieldName.Pluralize()}\")\n"
// ]);
//
// right.AppendImportIfNotExists(
// $"orm.entities.{left.FieldName}",
// $"{left.ClassName}",
// $"from orm.entities.{left.FieldName} import {left.ClassName}"
// );
// left.AppendImportIfNotExists(
// "typing",
// "List",
// "from typing import List"
// );
// right.AppendColumn([
// $"\t{left.FieldName}_id: Mapped[int] = mapped_column(ForeignKey(\"{left.TableName}.id\"))",
// $"\t{left.FieldName.Pluralize()}: Mapped[List[\"{left.ClassName}\"]] = relationship(back_populates=\"{right.FieldName}\")\n"
// ]);
//
// await _context.WriteFile(left.Path, left.Rewrite());
// await _context.WriteFile(right.Path, right.Rewrite());
}
private async Task<EntityModel> LoadEntity(string name)
{
var path = GetEntityPath(name);
var entity = new EntityModel(name, path, await _context.ReadFile(path));
entity.Initialize();
return entity;
}
private string GetEntityPath(string name) => $"orm/entities/{name.Underscore().ToLower()}.py";
}