• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

inclusion-numerique / coop-mediation-numerique / e0a826db-072e-40be-9965-94114cb85b31

05 Feb 2026 09:42AM UTC coverage: 7.371% (-3.1%) from 10.45%
e0a826db-072e-40be-9965-94114cb85b31

push

circleci

hugues-m
feat: user dataspace conseiller numerique data

(cherry picked from commit 014f5ad21)

469 of 9674 branches covered (4.85%)

Branch coverage included in aggregate %.

1330 of 14731 relevant lines covered (9.03%)

40.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/apps/web/src/auth/getSessionUserFromSessionToken.ts
1
import { serializePrismaSessionUser } from '@app/web/auth/serializePrismaSessionUser'
2
import type { SessionUser } from '@app/web/auth/sessionUser'
3
import { prismaClient } from '@app/web/prismaClient'
4
import type { Prisma } from '@prisma/client'
5

6
export const sessionUserSelect = {
×
7
  id: true,
8
  email: true,
9
  phone: true,
10
  siret: true,
11
  firstName: true,
12
  lastName: true,
13
  name: true,
14
  emailVerified: true,
15
  image: true,
16
  title: true,
17
  location: true,
18
  description: true,
19
  created: true,
20
  updated: true,
21
  role: true,
22
  isFixture: true,
23
  profilInscription: true,
24
  acceptationCgu: true,
25
  hasSeenOnboarding: true,
26
  structureEmployeuseRenseignee: true,
27
  lieuxActiviteRenseignes: true,
28
  inscriptionValidee: true,
29
  featureFlags: true,
30
  timezone: true,
31
  isConseillerNumerique: true,
32
  emplois: {
33
    select: {
34
      id: true,
35
      structure: {
36
        select: {
37
          id: true,
38
          nom: true,
39
          codePostal: true,
40
          codeInsee: true,
41
          commune: true,
42
          modification: true,
43
        },
44
      },
45
    },
46
    where: {
47
      suppression: null,
48
      fin: null,
49
    },
50
    orderBy: {
51
      debut: 'desc',
52
    },
53
  },
54
  mediateur: {
55
    select: {
56
      id: true,
57
      isVisible: true,
58
      coordinations: {
59
        select: {
60
          coordinateur: {
61
            select: {
62
              id: true,
63
              mediateursCoordonnes: {
64
                select: {
65
                  id: true,
66
                  mediateurId: true,
67
                  suppression: true,
68
                },
69
                where: {
70
                  suppression: null,
71
                },
72
              },
73
              user: {
74
                select: {
75
                  name: true,
76
                },
77
              },
78
            },
79
          },
80
        },
81
      },
82
      _count: {
83
        select: {
84
          enActivite: { where: { suppression: null, fin: null } },
85
        },
86
      },
87
    },
88
  },
89
  coordinateur: {
90
    select: {
91
      id: true,
92
      mediateursCoordonnes: {
93
        select: {
94
          mediateurId: true,
95
          suppression: true,
96
        },
97
      },
98
    },
99
  },
100
  rdvAccount: {
101
    select: {
102
      id: true,
103
      created: true,
104
      updated: true,
105
      lastSynced: true,
106
      accessToken: true,
107
      refreshToken: true,
108
      error: true,
109
      syncFrom: true,
110
      includeRdvsInActivitesList: true,
111
      organisations: {
112
        select: {
113
          organisation: {
114
            select: {
115
              id: true,
116
              name: true,
117
              email: true,
118
            },
119
          },
120
        },
121
      },
122
      invalidWebhookOrganisationIds: true,
123
    },
124
  },
125
} satisfies Prisma.UserSelect
126

127
const querySessionUser = async (sessionToken: string) =>
×
128
  prismaClient.session.findFirst({
×
129
    where: {
130
      sessionToken,
131
      expires: { gt: new Date() },
132
      user: {
133
        deleted: null,
134
      },
135
    },
136
    include: {
137
      usurper: {
138
        select: {
139
          id: true,
140
        },
141
      },
142
      user: {
143
        select: sessionUserSelect,
144
      },
145
    },
146
  })
147

148
export type PrismaSession = Exclude<
149
  Awaited<ReturnType<typeof querySessionUser>>,
150
  null
151
>
152

153
export type PrismaSessionUser = PrismaSession['user']
154
export type PrismaSessionUsupper = PrismaSession['usurper']
155

156
export const getSessionUserFromSessionToken = async (
×
157
  sessionToken: string | null,
158
): Promise<SessionUser | null> => {
159
  if (!sessionToken) {
×
160
    return null
×
161
  }
162

163
  const res = await querySessionUser(sessionToken)
×
164

165
  if (!res?.user) {
×
166
    return null
×
167
  }
168

169
  return serializePrismaSessionUser(res.user, res.usurper)
×
170
}
171

172
export const getSessionUserFromId = async (
×
173
  userId: string,
174
): Promise<SessionUser> => {
175
  const prismaSessionUser = await prismaClient.user.findUniqueOrThrow({
×
176
    where: {
177
      id: userId,
178
    },
179
    select: sessionUserSelect,
180
  })
181

182
  return serializePrismaSessionUser(prismaSessionUser, null)
×
183
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc