Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a757684
feat(user): add UTM parameters support in user creation and sign-up
Dobrunia Aug 6, 2025
ece94f6
Bump version up to 1.1.30
github-actions[bot] Aug 6, 2025
a4a7903
docs(user): clarify UTM parameter description in user creation and si…
Dobrunia Aug 6, 2025
9ab01e5
chore(deps): update @hawk.so/types to version 0.1.33 and enhance user…
Dobrunia Aug 6, 2025
33087ee
feat(user): validate and sanitize UTM parameters during user creation
Dobrunia Aug 6, 2025
14dc023
feat(analytics): enhance UTM parameter validation to include object t…
Dobrunia Aug 6, 2025
31ff97d
refactor(analytics): improve readability of UTM parameter validation …
Dobrunia Aug 6, 2025
e6a179f
refactor(utm): move UTM parameter validation and sanitization to a de…
Dobrunia Aug 9, 2025
c4aceeb
refactor(utm): add tests for UTM validation
Dobrunia Aug 9, 2025
bd6d64a
refactor(utm): extract UTM key validation and character checks into c…
Dobrunia Aug 12, 2025
02376ca
refactor(utm): define maximum UTM value length as a constant for bett…
Dobrunia Aug 12, 2025
e8114da
refactor(utm): enhance UTM parameter validation to return detailed re…
Dobrunia Aug 13, 2025
64b7122
chore(package): bump version to 1.1.32
Dobrunia Aug 13, 2025
6ff0955
Merge branch 'master' into feat/utm-tags-integration
Dobrunia Aug 13, 2025
c9e37d7
fix lint
Dobrunia Aug 13, 2025
4c6496e
fix lint
Dobrunia Aug 13, 2025
7febc31
refactor(utm): streamline UTM parameter sanitization and improve erro…
Dobrunia Aug 13, 2025
5d3ee35
test(utm): update UTM parameter validation tests to check for valid a…
Dobrunia Aug 13, 2025
e67f815
refactor(utm): simplify UTM parameter handling by removing sanitizati…
Dobrunia Aug 13, 2025
271e380
fix
Dobrunia Aug 13, 2025
34ea138
feat(users): add conditional UTM parameter inclusion in user data and…
Dobrunia Aug 13, 2025
61a95fd
test(utm): update validation tests to return undefined for null and n…
Dobrunia Aug 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hawk.api",
"version": "1.1.29",
"version": "1.1.30",
"main": "index.ts",
"license": "UNLICENSED",
"scripts": {
Expand Down
13 changes: 10 additions & 3 deletions src/models/usersFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,23 @@ export default class UsersFactory extends AbstractModelFactory<UserDBScheme, Use
* Creates new user in DB and returns it
* @param email - user email
* @param password - user password
* @param utm - UTM parameters
*/
public async create(email: string, password?: string): Promise<UserModel> {
const generatedPassword = password || await UserModel.generatePassword();
public async create(email: string, password?: string, utm?: any): Promise<UserModel> {
const generatedPassword = password || (await UserModel.generatePassword());
const hashedPassword = await UserModel.hashPassword(generatedPassword);

const userData = {
const userData: any = {
email,
password: hashedPassword,
notifications: UserModel.generateDefaultNotificationsSettings(email),
};

// Add UTM data if provided
if (utm && Object.keys(utm).length > 0) {
userData.utm = utm;
}

const userId = (await this.collection.insertOne(userData)).insertedId;

const user = new UserModel({
Expand Down
5 changes: 3 additions & 2 deletions src/resolvers/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,18 @@ export default {
* Register user with provided email
* @param _obj - parent object (undefined for this resolver)
* @param email - user email
* @param utm - UTM parameters
* @param factories - factories for working with models
*/
async signUp(
_obj: undefined,
{ email }: {email: string},
{ email, utm }: { email: string; utm?: any },
{ factories }: ResolverContextBase
): Promise<boolean | string> {
let user;

try {
user = await factories.usersFactory.create(email);
user = await factories.usersFactory.create(email, undefined, utm);

const password = user.generatedPassword!;

Expand Down
35 changes: 35 additions & 0 deletions src/typeDefs/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,36 @@ import { gql } from 'apollo-server-express';
import isE2E from '../utils/isE2E';

export default gql`
"""
UTM parameters input type
"""
input UtmInput {
"""
UTM source
"""
source: String

"""
UTM medium
"""
medium: String

"""
UTM campaign
"""
campaign: String

"""
UTM content
"""
content: String

"""
UTM term
"""
term: String
}

"""
Authentication token
"""
Expand Down Expand Up @@ -72,6 +102,11 @@ export default gql`
Registration email
"""
email: String! @validate(isEmail: true)

"""
UTM parameters
"""
utm: UtmInput
): ${isE2E ? 'String!' : 'Boolean!'}

"""
Expand Down