123 lines
4.7 KiB
C#
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";
|
|
} |