File size: 3,041 Bytes
4e645a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using TaskTrackingSystem.Shared.Models.Menu;
using TaskTrackingSystem.WebApi.Infrastructure;

namespace TaskTrackingSystem.WebApi.Features.Menu
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class MenuController : ControllerBase
    {
        private readonly MenuService _menuService;
        private readonly PermissionAuthorizationService _permissionAuthorizationService;

        public MenuController(MenuService menuService, PermissionAuthorizationService permissionAuthorizationService)
        {
            _menuService = menuService;
            _permissionAuthorizationService = permissionAuthorizationService;
        }

        [HttpGet]
        [HttpGet("tree")]
        public async Task<ActionResult<IEnumerable<MenuDto>>> GetMenuTree()
        {
            var roleId = User.GetRoleId();
            if (roleId > 0)
            {
                var menuTree = await _menuService.GetMenuTreeByRoleIdAsync(roleId);
                return Ok(menuTree);
            }

            var roleName = User.GetRoleName();
            if (string.IsNullOrWhiteSpace(roleName))
            {
                return Forbid();
            }

            var menuTreeByName = await _menuService.GetMenuTreeByRoleNameAsync(roleName);
            return Ok(menuTreeByName);
        }

        [HttpGet("all")]
        [HttpGet("access-items")]
        public async Task<ActionResult<IEnumerable<AccessMenuDto>>> GetAllAccessItems()
        {
            var canCreate = await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Create");
            var canUpdate = await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Update");
            if (!canCreate && !canUpdate)
            {
                return Forbid();
            }

            var menus = await _menuService.GetAllAccessItemsAsync();
            return Ok(menus);
        }

        [HttpGet("access-codes")]
        public async Task<ActionResult<IEnumerable<string>>> GetCurrentAccessCodes()
        {
            var roleId = User.GetRoleId();
            var roleName = User.GetRoleName() ?? string.Empty;
            var codes = await _menuService.GetCurrentAccessCodesAsync(roleId, roleName);
            return Ok(codes);
        }

        /// <summary>
        /// Returns a lightweight version string for the current user's role permissions.
        /// Clients poll this to detect when an admin has changed permissions without fetching the full menu list.
        /// </summary>
        [HttpGet("version")]
        public async Task<ActionResult<string>> GetMenuVersion()
        {
            var roleId = User.GetRoleId();
            var roleName = User.GetRoleName() ?? string.Empty;
            var version = await _menuService.GetMenuVersionAsync(roleId, roleName);
            return Ok(version);
        }
    }
}