👤 Profile
Profiles are the center of the Hudi univer, it is how one find everything related to an entity.
| Add buttions | Design | Prototype | Dev Mode | Task | Alpha Branch | Chat | Alpha | Beta | Production
- Details
- Design
- Develpment
- Launch
Details
Description​
The "Profile" is a lot more than a profile, it is a dynamic center for everything the user, business, artist, creator or anyone else wishes to display, it is also where they can drive fans to purchase merch or subscribe to exclusive content and so much more. Simply put while the "Overviews" & "Home" are the center for Hudi to display what we want to focus on, "Profiles" are the center for everything an individual or brand, (e.g. content, features, products etc.). Profiles are also the main feature of many products such as Go, Timeline, Biet Ezra and more, it is where all data related to an entity (person or otherwoise) is stored.
Status​
These details are only updated with each release, for more acurate updates and keeping track of progress, see the task in GitHub.
| Owner | Lead | Doc Status | Product Status | Last Update | Version | Release | Phase |
|---|---|---|---|---|---|---|---|
| Artyom | Artyom | In Progress | In Revision | 04.03.2024 | 0.01 | Internal | Alpha |
Use Cases​
Everything
Everything​
In the "Everything" part of Hudi profiles are used to ...
Social
Social​
In the "Everything" part of Hudi profiles are used to ...
Dating
Dating​
In the "Everything" part of Hudi profiles are used to ...
Biet Ezra
Biet Ezra​
When a user want to see details on someone in their familt tree, they will open the profile and see all family related events, pictures and more.
User Stories​
Persona One
Update Coming Soon
I am listening to a song and i want to know more about the artist, other songs they have and maybe I would like to get updates about new music.
Profile Types​
All profiles are esencaly the same, very raraly do we save difrent data for set type, the main reasion for diferenciating between profile types (along with profile titles) is for frontend design choices.
-
Branded
A branded profile is a business that pays to upgrade their store.
-
Org
an orginization can be a non profit/charirty, school, community org, etc.
-
Public Figure
a public figure can be a Host, Creator, actor, etc.
-
Business
-
Personal
Business​
The only profines that have business logic or revenue are Stores and Businesses, there profile types will have a free and paid option, each with varing features and design changes.
Reminders​
- Allow user to choose thier privary prefrences such as can be found by friends, everyone on Hudi, on the web, etc.
- #191
- #205
- Ensure Deep Link is setup
- Ensure theme is properly linked
- Be sure to follow the release guidelines
- Update Documentation
Links & Resources​
Coming Soon
- Biz Docs
- Research
- Design
- Prototype
- Dev Mode
- Task
- Alpha Branch
- Chat
- Alpha
- Beta
- Production
Development​
Before you start developing you will need to setup your environment, if you have not done that yet visit Development Envietment.
- Data
- Backend
- Endpoint
- Frontend
Data
- Structure
- Model
- Profiles
-
- Profile #1
-
-
- type (personal, professional, couple/family, dating, artist, host, business, store, shul, non profit, religious, etc.)
-
-
-
- title (Rabbi, Teacher, Officer)
-
-
-
- headline
-
-
-
- description/bio ("A look at what's inside the weekly Intermountain Jewish News, plus bonus content, with host Steve Mark.")
-
-
-
- created: "2024-10-15 00:19:10"
-
-
-
- last_updated:"2024-10-15 00:19:10"
-
-
-
- status:"draft, scredualed, published, deleted"
-
-
-
- location
-
-
-
- avatar
-
-
-
- cover
-
-
-
- primary_display_name
-
-
-
- primary profile (true, false)
-
-
-
- username
-
-
-
- description
-
-
-
- jewish, (ashkinazi, safardi, misrahi, friend to jewish people, etc.)
-
-
-
- Owner (Account ID)
-
-
-
- badge type (Fallen solger, politision, historical figure, etc)
-
-
-
- badge text
-
-
-
- visibility (private, contacts, hudi, web)
-
-
-
- following
-
-
-
- followers
-
-
-
- refrences (aray)
-
- refence 1
-
-
- refrence type (prfole, etc.)
-
-
-
- refrence ID/link (ID or link)
-
-
- refence 1
-
Collection: profiles​
Each user can have one profile, stored in this collection.
Example document:​
{
"_id": "ObjectId(...)",
"userId": "user_id_linked_to_users_collection",
"headline": "Fullstack Developer",
"description": "Loves building clean APIs",
"location": "Jerusalem",
"created": "2025-03-28T10:00:00Z",
"last_updated": "2025-03-28T10:00:00Z",
"status": "draft",
"avatar": "https://example.com/avatar.jpg",
"cover": "https://example.com/cover.jpg",
"primary_display_name": "John D.",
"primary_profile": false,
"username": "johndoe123",
"jewish": "",
"badge_type": "",
"badge_text": "",
"visibility": "private",
"following": 0,
"followers": 0,
"references": []
}
Notes:
userIdlinks to_idin theuserscollection.statuscan be"draft"or"published".visibilitycontrols access to the profile ("private"or"public").referencesis an array, usually empty.
Indexing Recommendation​
To improve performance:
- Create a unique index on
userIdinprofiles
Data Flow Summary​
After Firebase signup, the /addUser route is called:
- Creates a linked document in the
profilescollection - All queries are matched using MongoDB
_idanduserId
Locations​
- Structure
- Model
- locations
-
- location 1
-
-
- location type (store, home, work, school, custom, etc)
-
-
-
- primary (true, false)
-
-
-
- door (2)
-
-
-
- house number (322)
-
-
-
- street (oberwang)
-
-
-
- city:"Oberwang"
-
-
-
- provenc/state (Upper Austria)
-
-
-
- country:"Austria"
-
-
-
- country_code:"AT"
-
-
-
- country_name:"Austria"
-
state:"ob" status:"1" type:"4"
wallet_balance:"0" wallet_earning:"0"
Names
- Structure
- Model
- names
-
- name1
-
-
- langage
-
-
-
- primary
-
-
-
- title (Mr, Mis, Rabbi, Rabanit, PhD, Dr, etc)
-
-
-
- first name
-
-
-
- middle names
-
-
-
- last name
-
-
-
- display_name
-
Connections
- Structure
- Model
- connections
-
- refence 1
-
-
- refrence type (prfole, link, etc.)
-
-
-
- refrence ID/link (ID or link)
-
-
-
- refrence title ("Website", "email", "Facebook", "Instagram", "Twitter", "LinkedIn", etc.)
- following
-
- follow 1
-
-
- refrence type (following, follower, connection, etc.)
-
-
-
- refrence ID/link (ID or link)
-
-
- Structure
- Model
Relatives​
- relitave
-
- relitive 1
-
-
- relation type (family, friend, etc)
-
-
-
- relation (father, mother, sibling, cusin, uncle, etc.)
-
-
-
- distence, (first, one removed, etc)
-
-
-
- refrence ID/link (ID or link)
-
-
-
- relation through (ID)
-
-
Assets
- Structure
- Model
- assets
-
- source 1
-
-
- source name (BackBone CMS)
-
-
-
- assets type (content)
-
-
-
- user key
- cache
-
- cache 1
-
-
- title
-
-
-
- image
-
-
-
- asset ID
-
-
-
- ...
-
-
Dating​
- Structure
- Model
- dating
-
- intrests
-
-
- food
-
-
- looking for
-
-
- long term
-
-
-
- fun
-
-
- distence
-
Accomplishments​
- Structure
- Model
- acomplishments
-
- 1
-
-
- type
-
-
-
- title
-
-
-
- icon
-
-
-
- date
-
-
-
- custom
-
here is some exmple code, you can refine it using gemini
Understanding Date Handling in Firestore
Firestore stores dates as Timestamp objects. This is great because it provides built-in functionality for:
- Precision: Accurate representation of time down to nanoseconds.
- Ordering: Easy sorting and querying of dates.
- Time Zones: Handles time zone conversions seamlessly.
Implementation
Here's how you would integrate date fields into your Firestore schema using Dart:
import 'package:cloud_firestore/cloud_firestore.dart';
class Profile {
// ... other profile fields ...
// Accomplishments
List<Accomplishment> accomplishments;
Profile({
// ... other profile field initializers ...
required this.accomplishments,
});
// Factory constructor to create a Profile from a Firestore document
factory Profile.fromDocument(DocumentSnapshot doc) {
Map<String, dynamic> data = doc.data() as Map<String, dynamic>;
return Profile(
// ... initialize other profile fields ...
accomplishments: (data['accomplishments'] as List<dynamic>?)
?.map((e) => Accomplishment.fromMap(e as Map<String, dynamic>))
.toList() ?? [],
);
}
// Method to convert Profile to a map for Firestore
Map<String, dynamic> toMap() {
return {
// ... other profile fields ...
'accomplishments': accomplishments.map((e) => e.toMap()).toList(),
};
}
}
class Accomplishment {
String type;
String title;
String icon;
Timestamp date; // Store the date as a Timestamp
bool custom;
Accomplishment({
required this.type,
required this.title,
required this.icon,
required this.date,
required this.custom,
});
// Factory constructor to create an Accomplishment from a map
factory Accomplishment.fromMap(Map<String, dynamic> map) {
return Accomplishment(
type: map['type'] as String,
title: map['title'] as String,
icon: map['icon'] as String,
date: map['date'] as Timestamp, // Get the Timestamp directly
custom: map['custom'] as bool,
);
}
// Method to convert Accomplishment to a map
Map<String, dynamic> toMap() {
return {
'type': type,
'title': title,
'icon': icon,
'date': date, // Store the Timestamp
'custom': custom,
};
}
}
Explanation
- Timestamp: We use the
Timestampclass from thecloud_firestorepackage to represent dates in yourAccomplishmentobjects. - Serialization: The
toMap()method in yourProfileandAccomplishmentclasses converts your objects into maps that Firestore can understand, correctly handling theTimestampconversion. - Deserialization: The
fromDocument()andfromMap()factory constructors createProfileandAccomplishmentobjects from Firestore data, reading theTimestampdirectly.
Important Considerations
- Date Input: When getting dates from your user interface, you'll likely get them as
DateTimeobjects. You can easily convert aDateTimeto aTimestamplike this:
DateTime now = DateTime.now();
Timestamp timestamp = Timestamp.fromDate(now);
- Date Display: When displaying dates to the user, you'll need to convert the
Timestampback to aDateTimeand format it appropriately:
Timestamp timestamp = ...; // From Firestore
DateTime dateTime = timestamp.toDate();
String formattedDate = DateFormat('yyyy-MM-dd').format(dateTime);
Let me know if you'd like help with:
- Integrating this into your existing code.
- Specific date formatting for your UI.
- Querying your data based on dates.
- Any other aspects of your Firestore implementation!
class ContactInfo {
String? email;
String? phone;
String? linkedInUrl;
String? githubUrl; // Add other relevant contact details
ContactInfo({
this.email,
this.phone,
this.linkedInUrl,
this.githubUrl,
});
}
class LifeEvent {
String title;
String? description;
DateTime date;
LifeEvent({
required this.title,
this.description,
required this.date,
});
}
class Experience {
String title; // Job title
String company;
DateTime startDate;
DateTime? endDate; // Can be null for current positions
String? description;
Experience({
required this.title,
required this.company,
required this.startDate,
this.endDate,
this.description,
});
}
class Certificate {
String name;
String? issuingOrganization;
DateTime? issueDate;
DateTime? expirationDate; // Can be null for non-expiring certificates
String? credentialId; // For verification
String? credentialUrl;
Certificate({
required this.name,
this.issuingOrganization,
this.issueDate,
this.expirationDate,
this.credentialId,
this.credentialUrl,
});
}
Access​
- Structure
- Model
- access
-
- access 1
-
-
- account type (personal, org, agency)
-
-
-
- account ID
-
-
-
- name
-
-
-
- level (owner, admin, member, editor, comintor, viewer, cutome)
-
-
-
- permissions ()
-
Log​
- Structure
- Model
- log
-
- log 1
-
-
- log type (edit, access. etc)
-
-
-
- by (user id)
-
-
-
- stapped (date, time)
-
-
-
- modification (arry old and new data)
-
-
-
- review, approved (user ID)
-
-
-
- remition time frame
-
Backend
While all the content, products, memberships, subscriptions, events and many other features are handled by third party APIs, the profile itself is managaed by our own backend and most of the data saved within our own database.
Functions​
Utilized Functions
- Switch Board (handle data sync between APIs)
Data​
Fore details on what data we need and what we get from the dependent APIs, see Profile Data Structure.
Dependicies​
- BackBone CMS
- BackBone Commerce
- BackBone Events
Tasks​
Parent Tasks
Parent Tasks​
Child Tasks
Child Tasks​
Frontend
Widgets​
Dependencies​
Tasks​
Parent Tasks
Child Tasks
Sub-Tasks​
- #data structure
- #profile backend
- create a scraper that auto generates profiles for public figures
- #claim profile
- #profile API endpoint
- Buy the frontend app
- merge with codebase
- create a cloud function that pulls data into our database
- create API that bring data to app
- connect API to app
- create wall of honor profiles
- create hall of Fame profile
Compatibility​
- Android Phones
- Android Tablets
- Android Watch
- Android TV
- iOS
- iPad
- iWatch
- Apple TV
- Chrome OS
- Mac OS
- Google Cast
Views​
These are the views that make up the user experience of a complete and independent product, while many of these views are shared across multiple products, they are customized to serve a Uniquely "podcast" experience to the user.
-
[Splash]​
Just as with any splash views, we want to establish the podcast brand and give the overview views and it's content time to check for updates and load.
- User Story
- User Flow
- Design
Features​
Below is a list of features that will be utilized in order to deliver a great podcast experiance. The details bellow are not comprehensive feature details but rather, describe how the features will be utilized withon the podcast product, for further details, please see the individual feature documentation.