Add support page, admin features, and auth hardening.

Rename public affiliate route to /support with localized nav labels, and include affiliate/social/wallpaper admin, 2FA login, and related site updates.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Atakan Doğan Özban
2026-07-29 20:25:55 +02:00
co-authored by Cursor
parent 202dc16a52
commit fc45c35dbe
149 changed files with 3496 additions and 11263 deletions
+64 -48
View File
@@ -17,64 +17,80 @@ namespace atakanozbancom.Controllers
public PartialViewResult projectposts()
{
var cultureFull = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
var cultureShort = System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
var cultureFull = Thread.CurrentThread.CurrentUICulture.Name;
var cultureShort = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
var isEnglish = cultureShort == "en";
var model = c.MyProjects
var projects = c.MyProjects
.Include(p => p.Translations)
.Select(p => new MyProjectsVM
.ToList();
var ids = projects.Select(p => p.id).ToList();
var medias = c.projectmedia
.Where(m => ids.Contains(m.project_id))
.OrderBy(m => m.sort_order)
.ThenBy(m => m.id)
.ToList();
var mediaLookup = medias
.GroupBy(m => m.project_id)
.ToDictionary(g => g.Key, g => g.ToList());
var model = projects.Select(p =>
{
var title = !isEnglish
? p.Translations
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
.Select(t => t.title)
.FirstOrDefault() ?? p.title
: p.title;
var description = !isEnglish
? p.Translations
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
.Select(t => t.description)
.FirstOrDefault() ?? p.description
: p.description;
var vm = new MyProjectsVM
{
id = p.id,
title = title,
description = description,
image = p.image,
iframe = p.iframe,
iframe = p.iframe
};
title = !isEnglish
? p.Translations
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
.Select(t => t.title)
.FirstOrDefault()
?? p.title
: p.title,
// NEW MEDIA TABLE
if (mediaLookup.TryGetValue(p.id, out var list))
{
vm.medias = list.Select(m => new ProjectMediaVM
{
url = m.url,
order = m.sort_order,
type =
m.media_type == MediaType.Image ? "image" :
m.media_type == MediaType.Iframe ? "iframe" :
// m.media_type == MediaType.Video ? "video" :
"document"
}).ToList();
}
description = !isEnglish
? p.Translations
.Where(t => t.culture == cultureFull || t.culture == cultureShort)
.Select(t => t.description)
.FirstOrDefault()
?? p.description
: p.description
})
.ToList();
// fallback legacy
if (vm.medias == null || vm.medias.Count == 0)
{
if (!string.IsNullOrWhiteSpace(p.iframe))
vm.medias.Add(new ProjectMediaVM { type = "iframe", url = p.iframe, order = 0 });
if (!string.IsNullOrWhiteSpace(p.image))
vm.medias.Add(new ProjectMediaVM { type = "image", url = p.image, order = 1 });
}
return vm;
}).ToList();
return PartialView(model);
}
[HttpGet]
public ActionResult myprojectsget(int id)
{
var p = c.MyProjects
.Include(x => x.Translations)
.FirstOrDefault(x => x.id == id);
if (p == null) return HttpNotFound();
var tr = p.Translations?.FirstOrDefault(t => t.culture == "tr" || t.culture == "tr-TR");
var vm = new AdminMyProjectsEditVM
{
id = p.id,
image = p.image,
iframe = p.iframe,
TitleEN = p.title,
DescEN = p.description,
TitleTR = tr?.title ?? "",
DescTR = tr?.description ?? ""
};
return View("~/Views/admin/myprojectsget.cshtml", vm);
}
}
}