File size: 3,205 Bytes
fa5d0ef
 
 
 
a7c1c74
 
 
 
 
 
 
 
 
 
 
 
 
fea9527
90ebf1e
 
 
fa5d0ef
 
 
a7c1c74
 
 
fa5d0ef
90ebf1e
 
 
 
a7c1c74
90ebf1e
a7c1c74
90ebf1e
 
 
 
 
 
 
 
 
b1da44c
90ebf1e
 
 
 
 
 
 
 
 
a7c1c74
90ebf1e
 
 
 
 
 
 
 
 
 
 
b1da44c
90ebf1e
 
 
 
fa5d0ef
 
 
 
 
a7c1c74
b1da44c
fa5d0ef
 
 
a7c1c74
 
 
 
 
 
 
 
 
 
fa5d0ef
a7c1c74
fa5d0ef
 
 
 
 
 
 
fea9527
fa5d0ef
 
a7c1c74
fa5d0ef
a7c1c74
fa5d0ef
 
 
 
 
 
 
fea9527
fa5d0ef
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from src.notifications.service import get_user_device_tokens
from src.notifications.fcm import send_fcm


def ensure_list(value):
    """
    Makes sure the value is always a list.
    - If it's already a list/tuple/set -> convert to list and return
    - If it's None -> return empty list
    - Otherwise -> wrap single value in a list
    """
    if value is None:
        return []
    if isinstance(value, (list, tuple, set)):
        return list(value)
    return [value]


# -------------------------------
# SEND TO MENTOR + LEAD
# -------------------------------
# -------------------------------
# SEND TO MENTOR + LEAD
# -------------------------------
async def send_leave_request_notification(session, user, leave, mentor_ids, lead_ids):
    mentor_ids = ensure_list(mentor_ids)
    lead_ids = ensure_list(lead_ids)

    # ---------------------------
    # SEND TO MENTORS (Approval screen)
    # ---------------------------
    mentor_tokens = []
    for mentor_id in mentor_ids:
        mentor_tokens += await get_user_device_tokens(session, mentor_id)

    mentor_tokens = list(set(mentor_tokens))

    if mentor_tokens:
        await send_fcm(
            mentor_tokens,
            "New Leave Request",
            f"{user.user_name} requested leave",
            {
                "type": "leave_request",
                "screen": "MentorApproval",
                "leave_id": str(leave.id),
            },
            priority="high",
        )

    # ---------------------------
    # SEND TO TEAM LEADS (Leave Details screen)
    # ---------------------------
    lead_tokens = []
    for lead_id in lead_ids:
        lead_tokens += await get_user_device_tokens(session, lead_id)

    lead_tokens = list(set(lead_tokens))

    if lead_tokens:
        await send_fcm(
            lead_tokens,
            "New Leave Request",
            f"{user.user_name} requested leave",
            {
                "type": "leave_request",
                "screen": "LeaveDetails",
                "leave_id": str(leave.id),
            },
            priority="high",
        )


# -------------------------------
# SEND TO USER + TEAM LEAD
# -------------------------------
async def send_leave_status_notification(session, leave, mentor_name, lead_ids):
    title = "Leave status"
    body = f"Your leave was {leave.status.lower()} by {mentor_name}"

    # Send to USER
    user_tokens = await get_user_device_tokens(session, leave.user_id)

    # Send to TEAM LEADS
    lead_tokens = []
    for lead_id in lead_ids:
        lead_tokens += await get_user_device_tokens(session, lead_id)

    lead_tokens = list(set(lead_tokens))

    # 1) Notify user
    await send_fcm(
        user_tokens,
        title,
        body,
        {
            "type": "leave_status",
            "screen": "LeaveDetails",
            "leave_id": str(leave.id),
        },
        priority="high",
    )

    # 2) Notify all leads
    await send_fcm(
        lead_tokens,
        title,
        f"Leave {leave.status} for user {leave.user_id}",
        {
            "type": "lead_update",
            "screen": "LeaveDetails",
            "leave_id": str(leave.id),
        },
        priority="high",
    )