skygeario / features Goto Github PK
View Code? Open in Web Editor NEWFeature Tracking Repo for Skygear
License: Apache License 2.0
Feature Tracking Repo for Skygear
License: Apache License 2.0
Support versioning of content in CMS. So that end users can rollback in case a wrong content is updated.
Put Design and Specification here with links
Support Web Push Notification for JS SDK.
WIP
A standard event tracking API supporting PostgreSQL as data store.
SkygearTracker(container: SkygearContainer)
SkygearTracker.prototype.track(eventName: string, properties: { [string]: number | string | boolean })
import SkygearTracker from 'skygear-tracker';
// skygear is actually an instance of SkygearContainer
import skygear from 'skygear';
// To construct an instance of SkygearTracker
// Invoke the constructor with an instance of SkygearContainer
const skygearTracker = new SkygearTracker(skygear);
// You can use this skygearTracker throughout your app if you only work with a single
// SkygearContainer
skygearTracker.track('Posted an item for sale', {
currency: 'HKD',
price: 20,
});
In addition to the properties given by the caller, the tracker also gather information from the runtime environment and send them to the server.
_id
: a server generated UUIDv4 id for the event_user_id
: the user id of the user, in our case it is _user.id
_received_at
: the timestamp with timezone when the event is received by the server_tracked_at
: the timestamp with timezone when the event is tracker by the caller_sent_at
: the timestamp with timezone when the event is sent by the client_event_raw
: the event name as given by the caller, e.g. Posted an item for sale
_event_norm
: the normalized event_name, e.g. posted_an_item_for_sale
. This is same as the table name in the relational database_ips
: the ip as seen by the server._page_path
: the pathname of the url, e.g. /about
_page_search
: the querystring of the url, e.g. ?utm_campaign=easter-sale
_page_url
: the full url, e.g. https://www.example.com/about?utm_campaign=easter-sale
_page_referrer
: the value of document.referrer
_utm_campaign
: the utm_campagin
in querystring, if any_utm_channel
: the utm_channel
in querystring, if any_user_agent
: the value of navigator.userAgent
_app_id
: CFBundleIdentifier
or Application.getPackageName()
_app_version
: CFBundleShortVersionString
or PackageInfo.versionName
_app_build_number
: CFBundleVersion
or PackageInfo.versionCode
_device_id
: [[UIDevice currentDevice] identifierForVendor]
or Settings.Secure.ANDROID_ID
_device_manufacturer
: "Apple"
or Build.MANUFACTURER
_device_model
: utsname.machine
or Build.MODEL
_device_os
: "ios"
or "android"
_device_os_version
: [[UIDevice currentDevice] systemVersion]
or Build.VERSION.RELEASE
_device_carrier
: [CTCarrier carrierName]
or TelephonyManager.getNetworkOperatorName()
_device_locales
: A list of comma separated BCP47 tags, e.g. "en-US,ja-JP,zh-Hant-HK"_device_locale
: The first item of _device_locales
_device_timezone
: [[NSTimeZone localTimeZone] name]
or TimeZone.getDefault().getID()
Put a list of open questions here before a complete design / specification is decided
When a device is offline, the pubsub channel should cache and send it again when the device is online again.
WIP
Provide basic IoT usage supports. Related repo:
@akiroz please open issues related with this feature and put it below
There are cases to temporary disable a user. For example, violation of the term of use; awaiting settle of a payment, etc.
Currently, a developer can do two things to achieve the goal.
!
in front of the password has to make it invalid)user
record.We want to provide a built-in way to do it.
Put (link to) Portal Design here
These three API requires a special "user_management" role to call:
skygear.auth.disableUser(user, [message="Account blocked"], [expire_at=never])
skygear.auth.enableUser(user)
skygear.auth.changePasswordatLogin(user)
After disableUser
or changePasswordatLogin
was called, the user's subsequent API call will return NotAuthenticated
.
Put list of Scenario how developers will use this API
Put sample code of how you vision this API will be used, consider different type of developers and different abstract level
Support MQTT for two use cases:
WIP
Make it possible to edit the settings and theme of CMS from developer portal, before we make a more feature rich editor.
An official recommended way to implement many-to-many relations in Skygear Cloud DB.
Approach A. Store array of references in each record
Approach B. Create an intermediate record
For approach A, current one can use Skygear.ReferenceArray
with a list of objects, and use containsValue
to filter it.
To support this approach, we will need to:
containsValue
filter.@samuelplaymore suggested that:
I think we can take a reference from Parse.Relation.
It also save an intermediate class dynamically.Take a look with the following 3 classes in Parse and MongoDB.
_User, _Role, _Join:users:_Role
Support approval workflow for CMS:
Put Design and Specification here with links
Since we expect users who wrote Cloud Functions will access the PostgreSQL server with SQL directly, it would be very handy if there is a default ORM, and an easy way to convert the query result into Skygear Records.
WIP
Have official plugins for common SSO support; And also make it easy to enable and config them from Skygear Portal.
Put (link to) Portal Design here
To be expanded
AuthProvider A
, but the email already got another account from AuthProvider B
, show an error and tell users to login with another AuthProvide B
AuthProvider A
, but the email already got another account from AuthProvider B
, tell users to login and link with new AuthProviderAuthProvider A
, but the email already got another account from AuthProvider B
, assume it is two different accounts (will break the assumption of Skygear, which each users got unique email address)AuthProvider
Put sample code of how you vision this API will be used, consider different type of developers and different abstract level
This is the API I am proposing
loginWithOAuthProvider(providerID, options, [accessToken])
providerID
- A string that identify the login provideroptions
popup
(default), or redirect
redirect
, skygear will redirect the user to this url after auth. If it is null, back to the current URLaccessToken
- Optional. Pass in access token if client already has it, skygear will try to login directly instead of going through the OAuth flow.associateAccountWithProvider(providerID, options)
providerID
- A string that identify the login provideroptions
popup
(default), or redirect
redirect
, skygear will redirect the user to this url after auth. If it is null, back to the current URLgetOAuthTokens()
Return a promise of tokens
getOAuthTokens().then(function(tokens){
//tokens['com.facebook'] is FB's access token
});
loginWithFacebook(options)
and loginWithGoogle(options)
options
popup
(default), or redirect
redirect
, skygear will redirect the user to this url after auth. If it is null, back to the current URL-[SKYContainer loginWithOAuthProvider:(NSString*)providerID, options:(NSDictionary*)options completion:(void(^)(NSError*, SKYUser*))]
providerID
- A string that identify the login provider
com.facebook
, com.google
options
popup
(default), or redirect
, popup means in-app-browser (SFSafariViewController/WKWebView) and redirect means Safari.app-[SKYContainer loginWithOAuthProvider:(NSString*)providerID, accessToken:(NSString*)accessToken completion:(void(^)(NSError*, SKYUser*))]
accessToken
- Client calls this API if it already has an access token, skygear will try to login directly instead of going through the OAuth flow.-[SKYContainer associateAccountWithProvider:(NSString*)providerID options:(NSDictionary*)options completion:(void(^)(NSError*, SKYUser*))]
providerID
- A string that identify the login provideroptions
popup
(default), or redirect
, popup means in-app-browser (SFSafariViewController/WKWebView) and redirect means Safari.app-[SKYContainer getOAuthTokensWithCompletion:(void(^)(NSError*, NSDictionary*))]
Return tokens
[container getOAuthTokensWithCompletion:^(NSDictionary *tokens){
//tokens['com.facebook'] is FB's access token
}];
-[SKYContainer loginWithFacebook:(NSDictionary*)options]
and -[SKYContainer loginWithGoogle:(NSDictionary*)options]
options
popup
(default), or redirect
, popup means in-app-browser (SFSafariViewController/WKWebView) and redirect means Safari.appUNIQUE_EMAIL_FOR_ACCOUNTS
FACEBOOK_CLIENT_SECRET
GOOGLE_API_KEY
SSO_ENABLED
e.g FACEBOOK,GOOGLE.
oauth:auth_url
oauth:handle_code
oauth:handle_access_token
JS, iOS and Android should follow this flow:
oauth:handle_access_token
, to receive skygear userUNIQUE_EMAIL_FOR_ACCOUNTS
oauth:auth_url
oauth:handle_code
)UNIQUE_EMAIL_FOR_ACCOUNTS
oauth:handle_access_token
UNIQUE_EMAIL_FOR_ACCOUNTS
Preparation
Implementation
QA
Documentation
Release
To make #3 possible, we need to make Cloud Functions Deploy & Test Cycle much quicker
Put Design and Specification here with links
In order to make #3 Cloud Function Development Environment possible, we need to be able to have a skycli command line interfaces to:
Put Design and Specification here with links
Allow admin to edit data structure of Skygear Cloud DB from Developer Portal / CMS.
The editor should works by showing the Table already existed in the database, users should be able to create new table, or modify existing table.
Each column have a Field Type. The field type is NOT the data type, however only compatible Field Type can be assigned to Data Type. The Field type is used to display the correct editing fields inside the CMS.
Each column have it's Properties listed below.
Support using 3rd party Identity Provider for User Auth
Optionally users can require Email / SMS Confirmation for Changing Password
WIP - Just an idea / randomly asked by users.
Handle the use case of User Profile have an email field, and users need to verify by emails before using certain functions.
User Auth
> Email Verification
)
[[url]]
to include the link to confirmation result page.Put (link to) Portal Design here
When user click on an action that require email verification:
if !currentUser.email_verified
skygear.userUtils.sendEmailVerfication('actionX')
The above code will send an email, and the verification links after clicked, will comes with actionX as the parameter. actionX
will pass as a string as query string to the redirected URL after the verification link is clicked, or ignored if users supply an HTML template.
Put Design and Specification here with links
sendEmailVerification(currentLink)
from client sideUser.email_verified
return true
or false
Add a user list and allow basic users management from Skygear Portal. It also include several new features not exist yet: Login history, Block User, Devices Record, Track Location from Client SDK
User Auth
> Users
:
Handle the use case of User Profile have an phone field, and users need to verify by SMS before using certain functions.
Related with #19 Login by SMS?
sendSMSVerification()
from client side (support any fields or a default field for phone no?)verifySMSVerification(code)
from client side, return success
or failure
User.verifiedBySMS()
return true
or false
Something like rqworker/rqscheduler
Put a list of questions here before if you cannot provide a complete design / specification yet
Put Design and Specification here with links
While Cloud Functions have been heavily used by a lot of existing users, there are a few recurring requests we've got:
So far two kind of use cases are most common:
Login by SMS, kind of like Telegram / Village. Where users have no username / email (both are optional), users can sign up or login simply by a verification on SMS.
WIP
skygear.auth.passwordlessSend({
connection: 'email', // or 'sms'
send: 'code', // or link
email: '[email protected]' // phoneNumber
})
skygear.getLoginRedirectResult().then(function(skygearUser) {
}).catch(function(error) {
});
This issue is an effort to expand the feature set of Skygear Portal. We aim at covering most common features required by skygear.io users.
While most features tracked here are related to the portal, it is very likely the portal will cover some features do not currently exist in open source skygear-server and would be developed in open source version in parallel with the portal.
There is a meta feature issue for an even longer roadmap #30
A plugin allows to like any skygear resource (e.g. user / custom created resources), and able to provide common features required related to like
The necessary originated from Village (https://basecamp.com/2635797/projects/10525916/messages/56678569).
Proposed by @royuen
Support 3rd party Email Provider or Custom SMTP server for better email deliverability. It is an Skygear.io exclusive issue and should not be related with Open Source version.
WIP
Cloud Functions need a better development environment. The goal is let developers update code and test quickly (Depends on #2 and #42); And then one can simply test the code by simulating a request for:
It should also return the console & error logs immediately.
There are two ideas currently:
For web interface, as the plugins runtime will crash if syntax error and lost all of the code (as mentioned in oursky/skygear-cloud#351), it will need to store the code separately.
Support Conditional save predicate which is useful when users need to handle some atomic save siutation.
Purpose: The conditional save predicate is used by the client to specify conditions in which a record should be saved. Conditions are evaluated by the server.
Proposal: record:save
request to have a new attribute that state the predicate for which the record should be saved if the existing record satisfy the predicate (in other words, “satisfy” means a query of that predicate will return the record).
Example: a record is only saved if date is null:
{ "action": "record:save",
"records": [{
"_save_predicate": {"eq", "date", null},
"_id": "note/abc"
}]}
// or
{ "action": "record:save",
"predicate": {"eq", "date", null}",
"records": [/* ... */]
}
This is a meta feature, for list of SSO support heard from clients / users.
(Please feel free to comment if you wish one of the platform will be implemented earlier. The order here is important)
This is an issue to evaluate the usage of HTTP2 and Message Pack as transport between Skygear-server and plugins runtime in Skygear micro-services architecture.
It aims at replacing zmq for maintainability.
Put Design and Specification here with links
Make it possible for CMS user to login as users from the portal. (Think about God mode)
Multiple users asked about it would be much simpler if they can just start calling CloudDB features with anonymous users session.
WIP
Preparation
Implementation
Documentation
Release
Allow users to look at a list of devices registered via SDK.
Design Link: https://projects.invisionapp.com/share/6AB1RERBK#/screens/225932555
Status | Device ID | Device Class | IP Address | Device Channel | Skygear SDK Version | Application Version |
---|---|---|---|---|---|---|
grey: offline green: online | String (provided by IoT SDK) | String (server side setting) | String | View in Pub/Sub (link) | String | String |
Users can perform 3 things in this table. They can
1 - Filter information to view the table
There are filter for the table. If multiple conditions are selected, it is consider an AND conditions.
2 - Multi-select the device and perform 3 actions
The multi-select function is on the first column of the table.
The 3 actions are
When there is no check off on the box, the 3 actions buttons should be unclickable.
3 - Click the 'View in Pub/Sub' link in Device Channel on the table for Pub/Sub feature
When users click on the 'View in Pub/Sub' link, they will be redirected to the Pub/Sub dashboard page with the param (the subscribe channel)
Extend ACL to policy-based for fine-grained access control, with sensible default for users like role-based one.
Some notes for ideas:
<record type>:<record id>:<column name>
Role based access control for CMS:
Some should refer to Record Type / Content Type here.
Put a list of questions here before if you cannot provide a complete design / specification yet
Put Design and Specification here with links
It is quite common business users need to input different languages translation for content in an app. It would be important to have built-in support for CMS interface and on API level.
Put Design and Specification here with links
A Dashboard to listen to Pubsub Channel, and send Pubsub message via Portal
Design Link: https://projects.invisionapp.com/share/6AB1RERBK#/screens/225937760
Input part
A CMS-like Portal for sending Push Notification
Reference of Design: https://dl.dropboxusercontent.com/u/27303632/skygear-specs/skygear-cms-push-2/index.html
Everything included in the design above can be considered as v1.0, features listed below can be considered for future improvement/consideration:
Revamp architecture of Cloud Functions to make test and deploy cycle quicker and safer. Quicker meant for update code to test should be in matters of seconds (< 15 sec?); Safer meant if a Cloud Function crash rest of the Skygear should remain safe.
@cheungpat will work out a design specification after oursky/skygear-cloud#351
Make it easy to create saved query on the server side; Then call them from client side and retrieve the result. Aims at making it easier to construct complicated query yet without re-implementing all of SQL on in Skygear
There are two ways to do it:
Although both method can be mixed, it seems better to priority for Method 2 which is easier to use.
It is also noted that the Query result will need to be in a specific format in-order to return the Skygear Record correctly. It is agreed that we should do it via an UI to guide users construct the query.
Finally, we will need to convert the SQL Query result to Skygear Records:
Tasks breakdown:
Plugins to implement forget password and welcome emails features
There is an existing plugins: https://github.com/skygeario/forgot_password/
forgotPassword(email)
from client-sideFORGOT_PASSWORD_SECURE_MATCH
is set to TRUE. (Hence users are expected to display something like If a matching account was found an email was sent to [email protected] to allow you to reset your password. after forgot password was requested.FORGOT_PASSWORD_SECURE_MATCH
is set to FALSE by default, which will return ResourceNotFound if the email doesn't match.FORGOT_PASSWORD_WELCOME_EMAIL
is set to TRUE, send an Welcome Email when new user signed up.User Auth
> Forgot Password
/ Welcome Email
)
[[url]]
to include link to the confirmation page.SKYContainer.default().forgotPassword(email: “[email protected]”)
skygearContainer.forgotPassword(“[email protected]”)
skygear.forgotPassword(“[email protected]”)
Add support for HTTP2 and take advantages of the protocol. e.g. Reduce overhead of multiple connections.
WIP
Support Inner Query like Parse.
https://parseplatform.github.io/docs/android/guide/#relational-queries https://web.archive.org/web/20170222001607/http://parseplatform.github.io/docs/android/guide/#relational-queries
Looks at whereMatchesQuery
whereDoesNotMatchQuery
include
Currently there are multiple APIs like discoverUserByEmails, getUsersByEmail, queryUsersByEmail etc. It is very confusing. We should consider design a new set by considering the scenario of usages.
Put sample code of how you vision this API will be used, consider different type of developers and different abstract level
PR:
Preparation
Implementation
Documentation
Release
Trigger Cloud Functions by Pubsub
WIP
Support GeoPolygon and Location storage, search by location and search by geometry.
Put list of Scenario how developers will use this API
const polygon = new skygear.GeoJSON({
"type": "Polygon",
"coordinates": [[
[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]
]]
});
const query = new skygear.Query(District);
const geoLocation = new skygear.Geolocation(22.283, 114.15);
query.containsValue('area', geoLocation);
const place = new Place({
name: 'IFC HK',
location: geoLocation,
});
skygear.publicDB.save(place);
const query = new skygear.Query(Place)
query.contains('location', polygon);
const query = new skygear.Query(District);
query.containsValue('area', polygon);
http://geojson.org/geojson-spec.html#appendix-a-geometry-examples
{
"type": "Point",
"coordinates": [102.0, 0.5]
}
{
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
}
{ "type": "Polygon",
"coordinates": [
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
]
}
{ "type": "MultiPolygon",
"coordinates": [
[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
]
}
Put Design and Specification here with links
Put a list of open questions here before a complete design / specification is decided
A meta feature to track Skygear Portal development, kind of a wish list for skygear.io too.
When registering device token, tell which segment (or app) it is belonging to. When sending push notification, can choose to send to a user with which segment. e.g. only app A for this user will be received. But not another app sharing with.
WIP
Make it super-simple to enable 2FA support on apps. Aims at support Google Auth (TOTP) and SMS at the beginning.
WIP
Since Skygear early days, one of the most common usages internally is to build Chatbot (for Slack / FB Messenger, etc). We should consider how to improve this experience for users.
It depends on the completion of feature #3 Improve Cloud Functions Development Environment
WIP
Some initial idea:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.